2014-10-14 7 views
1

"http://learnyouahaskell.com"의 도움으로 하스켈을 배우고 있습니다. 나는이 접힌 나무를 나타내는 목록을 F.foldMap (\x -> [x]) testTree을 실행하면Foldable은 mappend의 구현을 어떻게 알 수 있습니까?

data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Show, Read, Eq) 

instance F.Foldable Tree where 
    foldMap f Nil = mempty 
    foldMap f (Node x l r) = (F.foldMap f l) `mappend` (f x) `mappend` (F.foldMap f r) 

: 나는 Foldable의 인스턴스가있는 BST (이진 검색 트리)의 예를 다음입니다. 난 내 자신의 데이터 형식 구현 :

newtype OnlySum a = OnlySum {value :: a} deriving (Eq, Ord, Read, Show, Bounded) 
instance Num a => Monoid (OnlySum a) where 
    mempty = OnlySum 0 
    OnlySum x `mappend` OnlySum y = OnlySum (x + y) 

을 그리고이 명령을 실행 :이 OnlySum {value = 34}로 접어 트리를 얻을 F.foldMap (\x -> OnlySum x) testTree을.

질문 : 어떻게 접이식는 foldMap에 전달하는 기능 f의 반환 유형에 따라 memptymappend의 정의를 알고 있나요? 하스켈이 그 정의를 자동으로 알 수있는 방법이 있을까요?

답변

3

definition of foldMap에는 typeclass 인스턴스 Monoid m이 필요합니다. 따라서 하스켈은 mappendMonoid에서 오는 것을 알고 있습니다. 특정 유형이 추론 된 다음 해당 유형에 따라 Monoid 유형 기 결정된 인스턴스가 결정되며 해당 유형 정의가 사용됩니다.

+0

그래서 기본적으로 다형성이 있습니다. 그렇지 않습니까? – OneEyeQuestion

+0

@OneEyeQuestion 네, 반환 유형에 대한 다형성 일뿐입니다. – bheklilr

+1

예, 유형이 문제를 해결하는 것 이상의 역할을합니다. 유형에 따라 지루한 런타임 코드가 생성됩니다. 타입을 작성할 때 코드를 저장하는 경우, 코드를 쓰는 것이 좋습니다. – pigworker