您好我用类型系列
编写了我的第一个程序{-# LANGUAGE TypeFamilies #-}
data Colist a = Colist (Maybe (a,Colist a))
class Listable l where type Item l :: *
toList :: l -> [Item l]
instance Listable (Colist a) where
type Item (Colist a) = (Colist a)
toList x = [x]
该程序应该采用Colist a并将其列入一个列表 我得到“项目l”无法与实际类型“l”匹配的错误。但我写了项目x EQUALS(Colist a)。我的错误在哪里?
答案 0 :(得分:2)
你的意思是......
{-# LANGUAGE TypeFamilies #-}
newtype List a = List (Maybe (a, List a))
class Listable l where
type Item l :: *
toList :: l -> [Item l]
instance Listable (List a) where
type Item (List a) = a
toList (List Nothing) = []
toList (List (Just (x, xs)) = x : toList xs
我已经改变了一些关于你的代码的事情。零,我将Colist
重命名为List
(因为在Haskell中没有像coinductive列表这样的东西)。一,我修复了缩进,使toList
成为Listable
类的方法。第二,我List a
的{{1}}实例返回Item
,而不是a
。三,我修复了List a
以实际返回toList
的元素列表 - 您的版本只将整个List
放入单例列表中。
我强烈怀疑你在这里滥用类型家庭。这是一个更简单,更简单的Haskell-ish这个类的公式:
List
或者你可以免费获得class Listable l where
toList :: l a -> [a]
instance Listable List where
toList (List Nothing) = []
toList (List (Just (x, xs)) = x : toList xs
并获得Foldable
:
toList