[英]Recursive functor instance in haskell
我遇到了Haskell关于递归Functor实例的问题。
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)
我创建了一个数据类型列表,我需要在其中填充Functor Fmap实例,我试图在数据类型派生(Functor)中使用它,但是我给了我一个错误:无法派发Functor必须使用DeriveFunctor,而我也不明白...
请帮忙
有两种方法可以使一个类的实例为某种类型: 要么
使用deriving
子句。 这仅适用于简单的类,其中有一种明显的方法可以定义实例的方法。 在Haskell98中,这些类仅为Eq
, Ord
, Enum
, Bounded
, Show
和Read
。 到目前为止,语言已经发展了很多,GHC现在可以派生更多的类,但是它始终需要打开语言扩展 。 特别是要导出Functor
,您需要输入
{-# LANGUAGE DerivingFunctor #-}
在源文件的顶部,或者使用以下命令调用编译器/解释器
$ ghc -XDeriveFunctor
(我不建议后者;如果这样做,您的文件将不会“自给自足”。)
启用该扩展名后,您只需编写
data List x = Hol | Hoofd x (List x) deriving (Show, Eq, Ord, Functor)
自己编写实例。 这就是您在代码段中所做的,与代码deriving
无关。 您的实现是错误的,您可能会问一个问题,但是您应该包括当前出现问题的信息。
编辑
发现我的数据类型是递归的问题,但我的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)
现在可以正常工作了,如果还有另一个需要处理的元素,它将被发送回实例,直到没有必要处理为止
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.