2016-07-22 3 views
0

私は関数値を含むデータ型を持っていますが、showreadにできるようにしたいと考えています。私は関数を読み取ることができないことを知っているので、私は読んで関数を指定する方法が必要です。ここで 関数を持つデータ型のインスタンスを表示し、読み込みます

は私のデータ型です:

type Activation = (Vector Double -> Vector Double, Vector Double -> Vector Double) 

    data Layer = L { biases  :: !(Vector Double) 
       , nodes  :: !(Matrix Double) 
       , activation :: Activation 
       } 

    instance Show Layer where 
    show (L biases nodes _) = "(" ++ show biases ++ "," ++ show nodes ++ ")" 

そして、私はこのような機能が欲しい:

readLayer :: String -> Activation -> Layer 

どのように働くだろうか?

、レイヤーのためのあなたのショーのインスタンスは、ショーのインスタンスと同じである
readLayer str f = 
    let (biases, nodes) = read str 
    in Layer { biases = biases, nodes = nodes, activation = f } 

:ので、あなたはちょうどこれを行うことができ、レイヤを表示するために選択した道の事前

+0

さて、あなたはそれを無視するので、読んでいるときに関数の値をどういったものにしたいですか? –

+0

通常、私はそれを行うために 'String - > String - > Activation - > Layer'関数を使います。しかし何を試しましたか、どのようなエラーがありますか? 'String'を"読み込み "、' [Double] 'を生成する単純な関数を構築できますか?' Vector.fromList'が役に立つかもしれません。 – epsilonhalbe

+0

この 'readLayer'は通常の' Read'インスタンスとは異なります。 – epsilonhalbe

答えて

3

感謝for(Vector Double、Matrix Double)の場合

そうでない場合、状況はさらに複雑になります。

+0

LANGUAGEプラグマ '{ - #LANGUAGE RecordWildCards# - }'を使用している場合は、 'readLayer str activation = let(bias、nodes)= strをレイヤ{..}に書き込むことができます。 – epsilonhalbe

+1

ここで厳しくなる。入力を解析するためのそのような部分的な関数を定義することは常に問題ですが、一般的に少なくとも早期に失敗させることが最善です。 – dfeuer

+1

@dfeuerこれは私の発言や一般的な発言に対するコメントですが、私の解決策が元のものよりも厳密ではないとは思われません。型のstrictnessアノテーションがバイアス/ノードを自動的に評価するのではないでしょうか? – epsilonhalbe

関連する問題