2016-07-22 4 views
0

이것은 question에 대한 후속 질문입니다. 누군가가 형식 네트워크를 vectorSpace의 인스턴스로 만드는 것이 더 합리적이라고 제안했습니다.vectorSpace의 네트워크 인스턴스를 만듭니다

newtype Network = Network [(Matrix Double, Vector Double)] 

instance AdditiveGroup Network where 
    (Network n1) ^+^ (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m+n,v+w)) n1 n2 
    (Network n1) ^-^ (Network n2) = Network $ zipWith (\(m,v) (n,w) -> (m-n,v-w)) n1 n2 

instance VectorSpace Network where 
    type Scalar Network = Double 
    lambda *^ (Network n) = Network $ map (\ (m,v) -> (lambda*m,lambda*v)) n 

하지만 컴파일하려고하면 '스칼라'에 대해 잘못된 인스턴스를 작성했다는 오류가 발생합니다. 누군가 내가 잘못한 것을 설명 할 수 있습니까?

+0

앞으로 오류 메시지를 포함시켜야합니다. 그것은 무슨 일이 일어나고 있는지 파악하는 것이 훨씬 쉽고 빠릅니다. –

답변

0

type을 클래스와 인스턴스로 선언 할 수 있다는 것은 표준 하스켈이 아니기 때문에 type families extension의 일부입니다. 해당 오류를 제거하기 것은 힘든되지 않습니다, 당신은 단지 파일의 상단에 다음과 같은 언어 프라그를 추가해야 : 그러나

{-# LANGUAGE TypeFamilies #-} 

, 당신은 당신이 정의되지 않은 사실에 문제가있을 수 있습니다 AdditiveGroup 인스턴스에 zeroV 또는 negateV 나는 당신이 그것들을 어떻게 정의 할 지 확신하지 못한다 ... 당신은 그것들을 정의하지 않고도 벗어날지도 모른다. (당신은 경고를받을 것이고, 어떤 것은 런타임에 충돌 할 것이다).

관련 문제