【发布时间】:2016-03-07 16:40:42
【问题描述】:
我正在尝试为 Tree 编写函子(这种类型的形式如下所示)
data Tree a = Empty | Node a (Tree a) (Tree a)
instance Functor Tree where
fmap f Empty = Empty
fmap f (Node a x y) = Node (f a) (fmap f x) (fmap f y)
它似乎正在工作,但是更优雅的(我是 Haskell 的新手)解决方案呢?
第二期是讲师签名:fmap :: (a -> b) -> f a -> f b
对我来说,它是(a->b) -> Tree a -> Tree b,但编译器 ghci 不接受它。重点在哪里?
【问题讨论】:
-
如果您在 GHC 中启用
DeriveFunctor扩展,您可以让编译器为您派生 Functor 实例,方法是您将定义更改为data Tree a = Empty | Node a (Tree a) (Tree a) deriving (Functor)。不过,您的实现是相当标准的,所以我怀疑您是否可以自己制作一个更“优雅”的实现。 -
签名呢?
-
我不明白你的签名问题,
fmap的类型是(a -> b) -> f a -> fb,这就是你所拥有的,f是Tree。 -
你的回答对我来说没问题。为什么写成 f 而不是 Tree ?
-
@HaskellFun:不要忘记李的签名
fmap是不完整的,它缺少Functor f =>约束。
标签: haskell functional-programming