繁体   English   中英

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,而我也不明白...

请帮忙

有两种方法可以使一个类的实例为某种类型: 要么

  • 使用deriving子句。 这仅适用于简单的类,其中有一种明显的方法可以定义实例的方法。 在Haskell98中,这些类仅为EqOrdEnumBoundedShowRead 到目前为止,语言已经发展了很多,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM