2012-08-07 4 views
0

이 질문은 Data.List.Class의 사용 문제 (이전 질문과 관련된 질문은 Haskell Data.List.Class and syntax)입니다.Haskell data.list.class usage

코드의 관련 세그먼트는 아래에 나열되어 있습니다. 내 이해에서,이 클래스는 Haskell 목록 유형에 대한 유형 클래스 인터페이스 또는 일반화를 제공하는데, 이는 실제로 유용 할 수 있습니다. 그러나, 나는이 클래스의 사용법에 대한 많은 문서를 실제로 찾을 수 없었다. 아무도 좋은 설명서를 알고 있습니까?

또한 사용법 및 유형에 관한 기술적/특정 질문이 있습니다. 코드에서, 나는 타입 클래스 정의에서 runList와 joinL이 (어떤 의미에서) 서로 반전된다고 생각할 것이다.

-- other stuff omitted 
import Data.Functor.Identity (Identity(..)) 

data ListItem l a = 
    Nil | 
    Cons { headL :: a, tailL :: l a } 

Data.List.Class 
-- | A class for list types. Every list has an underlying monad. 
class (MonadPlus l, Monad (ItemM l)) => List l where 
    type ItemM l :: * -> * 
    runList :: l a -> ItemM l (ListItem l a) 
    joinL :: ItemM l (l a) -> l a 
    cons :: a -> l a -> l a 
    cons = mplus . return 

instance List [] where 
    type ItemM [] = Identity 
    runList [] = Identity Nil 
    runList (x:xs) = Identity $ Cons x xs 
    joinL = runIdentity 
    cons = (:) 

fromList :: List l => [a] -> l a 
fromList = foldr cons mzero 

첫째, 이맥스 모드에서 joinL $ runList [1, 2, 3]를 입력하지만, 나는 다음과 같은 오류 있어요 : 그것은 말처럼

Couldn't match type `ItemM (ListItem [])' with `Identity' 
Expected type: ItemM (ListItem []) (ListItem [] Integer) 
    Actual type: ItemM [] (ListItem [] Integer) 

은, 예상과 실제 유형이 정확히 일치하지 않습니다. 하지만 왜 다른 유형을 요구해야하는지 알 수 없습니다. runList :: l a -> ItemM l (ListItem l a)joinL :: ItemM l (l a) -> l a의 의미 또는 의미는 어떻게 다른가요?

또한, 다음과 같이 저는 이맥스 모드에서 매우 간단한 기능 fromList을 시도 : fromList [1,2,3], 아직 내가 가지고 :

Ambiguous type variable `l0' in the constraint: 
    (List l0) arising from a use of `fromList' 
Probable fix: add a type signature that fixes these type variable(s) 
In the expression: fromList [1, 2, 3] 
In an equation for `it': it = fromList [1, 2, 3] 

내가 모호성 여기가 왜 여기 혼란 스러워요, 어떻게 타입 서명을 추가 할 오류 메시지가 표시되면서 누구든지 설명해 주실 수 있습니까? 사전에

감사, 마지막 질문에 대한

답변

1

: 그것은 나중에 유추 된하지 않을 경우는 여러 종류있을 수 있습니다 목록 typeclass를 구현, 당신은 그것을 지정해야합니다. 예를 들어 fromList [1, 2, 3] :: [Int]이 정상적으로 작동합니다.