2016-07-22 2 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 

어떻게 그 일 것?

+0

글쎄, 당신은 그것을 무시하면, 그래서 당신은 무엇을 읽을 때 함수 값을 채우시겠습니까? –

+0

일반적으로 나는 그것을하기 위해'String -> String -> Activation -> Layer' 함수를 사용할 것입니다. 그러나 무엇을 시도 했습니까? 어떤 오류가 있습니까? 'String'을 "읽고"'[Double]'을 생성하는 간단한 함수를 만들 수 있다면'Vector.fromList'가 유용 할 것입니다. – epsilonhalbe

+0

이'readLayer'는 일반적인'Read' 인스턴스와 다릅니다. – epsilonhalbe

답변

3

때문에 방금이 작업을 수행 할 수있는 레이어를 보여주기 위해 선택한 방법의 사전에

감사합니다 :

입니다
readLayer str f = 
    let (biases, nodes) = read str 
    in Layer { biases = biases, nodes = nodes, activation = f } 

, 레이어에 대한 당신의 쇼 인스턴스는 쇼 인스턴스와 동일 for (Vector Double, Matrix Double) 용입니다.

그렇지 않은 경우 상황이 더 복잡해집니다.

+0

또는 LANGUAGE pragma'{- # LANGUAGE RecordWildCards # -}'를 사용하고 있다면'readLayer str activation = let (biases, nodes) = str을 레이어 {..}에 쓸 수 있습니다 ' – epsilonhalbe

+1

더 엄격해질 수 있습니다. 입력을 파싱하기위한 그러한 부분 함수를 정의하는 것은 항상 문제가 있지만 일반적으로 적어도 초기에 실패하게하는 것이 가장 좋습니다. – dfeuer

+1

@dfeuer는 내 발언이나 일반적인 발언에 대한 주석입니다. 내 솔루션이 원래의 솔루션보다 덜 엄격한 방식으로 보지 않습니다. 유형의 엄격 성 주석이 바이어스/노드를 자동으로 평가하지 않겠습니까? – epsilonhalbe

관련 문제