gpt4 book ai didi

haskell fmap 。 fmap 函数,两个仿函数上的函数

转载 作者:行者123 更新时间:2023-12-03 06:29:32 28 4
gpt4 key购买 nike

我发现自己越来越频繁地做这样的事情......

我有一个函数 f::IO [a] 然后我想对其应用一个 g::a -> b 类型的函数,以获得 IO [b]

还有很长的路要走:

x <- f
let y = fmap g x

然后我将其缩短为:

x <- f
let y = g <$> x

现在我更愿意:

y <- fmap g <$> f

但是有了仿函数定律,我发现我甚至可以做到:

(<$$>) = fmap . fmap
y <- g <$$> f

尽管我经常看到有人提到这个 fmap 。 fmap 我发现它在基础库中没有特殊的绑定(bind),虽然对我来说它似乎是一个非常频繁的习惯用法。我真的可以在任何地方使用这个!所以现在我想知道,我是否没有足够努力地编写纯代码,这就是为什么我比更有经验的 Haskell 程序员更能做到这一点......或者是否有一种更优雅的方法来实现这一点,这可以解释为什么其他人不使用这个习惯用法多少?

最佳答案

我认为(这在 Haskell 社区的某些部分中似乎相当不受欢迎)您应该编写代码来清楚地表达您的意图并遵循读者的期望,并且然后以代数方式将代码重构为“更整洁”的等效形式,但不再清晰。

在这种情况下,这里出现两次 fmap 似乎没有任何实际意义。您正在调整 IO 操作的结果这一事实在逻辑上与调整恰好映射到列表这一事实无关。如果您在代码中多次看到“fmap . fmap 模式”,那只是因为 fmap是一个很常见的函数。

如果你写

    y <- g <$$> x      -- or any other made-up operator name

您不仅迫使读者学习不熟悉的运算符,而且一旦他们学会了,就必须将其扩展到 y <- fmap g <$> x无论如何都要了解正在发生的事情,因为您将两个不相关的操作组合在一起。

最好的形式是你的y <- fmap g <$> x (或者更好, y <- map g <$> x ),因为它符合熟悉的模式 var <- function <$> action .

(顺便说一句,您提到了仿函数定律,但它们与您问题中的任何重写都没有任何关系,这只是扩展了定义。)

关于 haskell fmap 。 fmap 函数,两个仿函数上的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30153728/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com