이 질문은 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]
내가 모호성 여기가 왜 여기 혼란 스러워요, 어떻게 타입 서명을 추가 할 오류 메시지가 표시되면서 누구든지 설명해 주실 수 있습니까? 사전에
감사, 마지막 질문에 대한