haskell 中的递归仿函数实例

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我也没看懂...

请帮忙

有两种方法可以为某种类型创建 class-实例:或者

  • 使用 deriving 子句。这仅适用于简单的 classes,其中有 一种明显的方式 来定义实例的方法。 In Haskell98, these classes were only Eq, Ord, Enum, Bounded, Show, and Read。到目前为止,该语言已经发展了很多,GHC 现在可以派生更多 classes,但它总是需要打开 语言扩展 。特别是,要导出 Functor,您需要输入

    {-# LANGUAGE DerivingFunctor #-}
    

    在源文件的顶部,或者用

    调用compiler/intepreter
    $ 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)

现在可以了,如果有另一个元素需要处理,它将被发送回实例,直到注意到处理