2017-09-15 2 views
0

필 프리먼 (Phil Freeman)의 PureScript 책 섹션 6.7에서 연습 문제 5를 완료하려고합니다. 이 연습에서는 다음 유형에 대해 Foldable 인스턴스를 작성하려고합니다.foldMap에서 foldrDefault와 foldlDefault를 어떻게 사용합니까?

data NonEmpty a = NonEmpty a (Array a) 

foldMap을 구현하여이 사례를 작성했습니다.

instance foldableNonEmpty :: Foldable a => Foldable NonEmpty where 
    foldMap :: forall a m. Monoid m => (a -> m) -> NonEmpty a -> m 
    foldMap f (NonEmpty x xs) = (f x) <> (foldMap f xs) 

    foldr :: forall a b. (a -> b -> b) -> b -> NonEmpty a -> b 
    foldr f = foldrDefault f 

    foldl f = foldlDefault f 

그러나 다음과 같은 오류가 발생합니다.

Error found: 
in module Data.Hashable 
at src/Data/Hashable.purs line 110, column 11 - line 110, column 23 

    No type class instance was found for 

    Data.Foldable.Foldable t2 

    The instance head contains unknown type variables. Consider adding a type annotation. 

while checking that type forall f a b. Foldable f => (a -> b -> b) -> b -> f a -> b 
    is at least as general as type (a0 -> b1 -> b1) -> b1 -> NonEmpty a0 -> b1 
while checking that expression foldrDefault 
    has type (a0 -> b1 -> b1) -> b1 -> NonEmpty a0 -> b1 
in value declaration foldableNonEmpty 

where b1 is a rigid type variable 
     bound at line 110, column 11 - line 110, column 23 
     a0 is a rigid type variable 
     bound at line 110, column 11 - line 110, column 23 
     t2 is an unknown type 

나는 foldr = foldrDefaultNonEmpty가 내가 인스턴스에 노력하고있어,하지만 내가 어떻게 기본 배의 구현을 사용하는 아무 생각이 무엇을 할 때 이미 접을 수있는 컴파일러를 의미하기 때문에 오류를 받고 있어요 생각합니다. 어떤 도움이라도 대단히 감사하겠습니다.

답변

1

기본값을 사용하는 데 실제로 문제가 있다고 생각하지 않습니다. 당신이 필요하다고 생각하지 않는 인스턴스에 불필요한 Foldable a 제약 조건을 추가 한 것처럼 보입니다. 따라서 인스턴스는 다음과 같을 수 있습니다.

instance foldableNonEmpty :: Foldable NonEmpty where 

일단 제거하면 나머지는 맞다고 생각합니다.

여기 try.purescript.org 편집기에서 테스트했습니다. http://try.purescript.org/?gist=ce6ea31715bee2b65f3da374fd39181c