我遇到了关于递归Functor实例的haskell问题。
data List x = Hol | Hoofd x (List x)
deriving (Show,Eq,Ord)
instance Functor List where
fmap f (Hoofd x (Hoofd x)) = Hoofd (f x) Hoofd(f x)
fmap f Hol = Hol
fmap f Hoofd x (Hol) = Hoofd (f x)
我做了一个数据类型List,其中我需要填充Functor Fmap实例,我试图在数据类型中使用衍生(Functor)但我给了我一个错误:无法派生Functor必须使用DeriveFunctor我也不明白......
请帮助
答案 0 :(得分:2)
有两种方法可以为某种类型创建一个类实例:
使用deriving
子句。这仅适用于简单的类,其中有一种明显的方式来定义实例的方法。 In Haskell98, these classes were only Eq
, Ord
, Enum
, Bounded
, Show
, and Read
。到目前为止,语言已经发展了很多,GHC现在可以派生出更多的类,但它始终需要切换语言扩展。特别是,要导出Functor
,您需要输入
{-# LANGUAGE DerivingFunctor #-}
位于源文件的顶部,或者使用
调用编译器/解释器$ ghc -XDeriveFunctor
(我不推荐后者;如果你这样做,你的文件不会“自给自足”。)
启用该扩展程序后,您只需编写
即可data List x = Hol | Hoofd x (List x)
deriving (Show, Eq, Ord, Functor)
自己编写实例。这就是您在代码段中所做的,这与deriving
无关。你的实现是错误的,你可能会问一个问题,但是你应该把信息包含在当前出错的地方。
答案 1 :(得分:0)
修改
发现问题我的数据类型是递归的,但我的Functor实例却没有。
data List x = Hol | Hoofd x (List x)
deriving (Show,Eq,Ord)
instance Functor List where
fmap f Hol = Hol
fmap f (Hoofd x rest) = Hoofd (f x) (fmap f rest)
现在它可以正常工作,如果有另一个需要处理的元素,它将被发送回实例,直到无法处理