gpt4 book ai didi

haskell - 如何使用reader monad的函数实例?

转载 作者:行者123 更新时间:2023-12-02 00:02:05 25 4
gpt4 key购买 nike

我发现了这个 monad 的一个有趣用法:

Prelude Control.Monad> liftM2 (,) head tail $ [1..5]
(1,[2,3,4,5])

这看起来是一种有用的技术,它允许 (->) r 中的 r 只被传递一次,我希望这个表达式首先需要复制列表。

我不太明白这里的提升实际是如何工作的。 >>=return 隐藏在哪里?还有哪些其他常见情况需要使用此特定实例?

最佳答案

liftM2 采用一个二元函数和两个 monadic 值,并将该函数应用于 monad 内的值。查看实现:

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do
x1 <- m1
x2 <- m2
return (f x1 x2)

或者如果我们对其进行脱糖,我们可以看到显式的 (>>=)return:

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 =
m1 >>= (\x1 ->
m2 >>= (\x2 ->
return (f x1 x2)))

当您需要在 monad 中应用纯函数时,这很有用,因为这是一项非常常见的任务,所以用例非常广泛。

关于haskell - 如何使用reader monad的函数实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20768104/

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