【问题标题】:haskell understanding fmaphaskell 理解 fmap
【发布时间】:2015-12-24 04:18:34
【问题描述】:

有人可以帮助或指导我如何在以下实现中理解 fmap 函数。

data Rose a = a :> [Rose a] deriving (Eq, Show)
instance Functor Rose where
fmap f (x :> xs) = (f x) :> fmap (fmap f) xs

tree :: Rose Int
tree = 1 :> [2:>[]]

我不明白的部分(fmap f),为什么它再次进入递归,但它只需要1个参数。这怎么可能,因为它需要2。

第二部分是我不明白为什么这不起作用:

fmap f (x :> xs) = (f x) :> fmap f xs

我希望有人能给我一些关于如何理解这一点的方向。

【问题讨论】:

    标签: haskell recursion tree


    【解决方案1】:

    这是因为xsRose a 的列表。

    也许这更清楚:

    fmap f (x :> xs) = (f x) :> map (fmap f) xs
                                ^^^
    

    当然,对于列表,map = fmap

    即:

    1. f 申请到x
    2. 对于xs,将函数fmap f映射到列表xs

    【讨论】:

    • 感谢您的解释!终于明白了。:D
    【解决方案2】:

    欢迎使用咖喱!!正在发生的事情是您正在“部分应用”内部 fmap 以获取您提供给外部 fmap 的函数。只有这个嵌套的fmap 可以同时通过Rosetree[] 容器。

    注意

    fmap :: (a -> b) -> h a -> h b
    

    像下面这样部分应用给出了一个函数

    let g = fmap f :: h a -> hb
    

    然后将这个函数馈送到另一个 fmap

    fmap g xs
    

    【讨论】:

    • 感谢您的回答。这真的帮助我理解了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多