haskell中的递归functor实例

时间:2018-02-15 14:36:11

标签: haskell functor

我遇到了关于递归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我也不明白......

请帮助

2 个答案:

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

现在它可以正常工作,如果有另一个需要处理的元素,它将被发送回实例,直到无法处理