输入系列错误

时间:2017-12-21 17:11:22

标签: haskell types functional-programming type-families

您好我用类型系列

编写了我的第一个程序
{-# 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)。我的错误在哪里?

1 个答案:

答案 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