【问题标题】:I'm trying to define an instance of Functor for my Tree datatype in Haskell我正在尝试在 Haskell 中为我的 Tree 数据类型定义 Functor 的实例
【发布时间】:2011-02-22 01:35:42
【问题描述】:

我今天下午正在学习函子,并正在尝试为我刚刚编写的树数据类型编写一个。

data GTree a = Node a [GTree a] deriving (Show, Read, Eq)  

instance Functor GTree where
        fmap f n [] = f n
        fmap f n a = f n fmap a

我正在尝试编写它,以便如果列表为空,则映射到单个节点。否则,递归地映射列表。这是我得到的错误。

The equation(s) for `fmap' have three arguments,
but its type `(a -> b) -> GTree a -> GTree b' has only two
In the instance declaration for `Functor GTree'

我知道我有太多关于 fmap 的参数,但我不知道如何写出来以反映我想要它做的事情。

如果有人可以帮助我解决这个问题,将不胜感激。谢谢!

编辑: 这是我找到的一种可能的解决方案,但我不太明白。

instance Functor GTree where
    fmap f (Node a ts) = Node (f a) (map (fmap f) ts)

【问题讨论】:

  • 你需要使用构造函数:fmap f (Node n []) = ...
  • @luqui 感谢您的评论。这就说得通了。我尝试将该行更改为 fmap f (Node n []) = Node (f n) 并暂时注释掉第二行,但我仍然遇到错误。
  • Node 接受两个参数,你只给了它一个。需要是Node (f n) []。不要放弃,尤其是对于左关联应用程序 (f x y = (f x) y),这可能需要一些时间来适应。
  • 酷,感谢您向我指出这些东西。我对haskell很陌生,所以它有点融化我的大脑。我一定会坚持下去。 :)

标签: haskell


【解决方案1】:

fmap 的作用是接受一个类型为a -> b 的函数加上一个a 的框,它会返回b 的框。您应该使用 (Node a [])(Node a xs) 而不是 n []n a,这将匹配没有任何子节点的节点和有子节点的节点。

instance Functor GTree where
        fmap f (Node a xs) = Node (f a) (fmap (fmap f) xs)

【讨论】:

  • Ahhhhhh,我现在找到的解决方案完全有意义。感谢您花时间向我解释!
  • 这里不需要两个案例...map 可以很好地处理空列表。
  • 我是 fmap > 地图偏执狂。因此它应该完全是'fmap(fmap f)xs'
  • @Robert,只要您这样做,就可以像语义编辑器组合器一样使用它:(fmap.fmap) f xs,您可以看到它通过两个函子拼出a 的路径。我确定我们此时已经失去了科迪:-P
  • @luqui 是的,你当然是对的,它真的应该这样写,以便非常清晰和良好的实践。 Cody这里是我们指的文章:conal.net/blog/posts/semantic-editor-combinators
猜你喜欢
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-03
  • 2013-10-15
相关资源
最近更新 更多