Fmap在自定义类型列表?

时间:2016-09-29 10:50:37

标签: haskell functor

以下代码无法编译:

data Outcome a = Fail | Pass a deriving (Show, Eq, Ord, Functor)

myList = [Pass 33, Pass 12, Fail, Pass 45]

main = do
   print $ fmap (+1) myList

我不明白为什么这不起作用,因为我已经成功地将相同的方法应用于我的二叉树类型'data Tree a = Empty |节点a(树a)(树a)'?

2 个答案:

答案 0 :(得分:11)

问题在于您尝试向列表myList的每个元素Outcome Integer添加1。试试这个:

fmap (fmap (+1)) myList

或者说得更清楚:

map (fmap (+1)) myList

因此外部fmap适用于列表,而内部Outcome适用于fmap (+1)仿函数。因此,对于列表中的每个元素,我们应用函数(+1),然后将函数Outcome应用于composer.json内的值。

答案 1 :(得分:6)

列表是仿函数,你有一个[Outcome]所以你需要提供一个函数Outcome -> b。您似乎希望将(+1)应用于列表中的每个Outcome,因此您需要使用:

fmap (\o -> fmap (+1) o) myList

fmap (fmap (+1)) myList