gpt4 book ai didi

haskell - 单子(monad)绑定(bind)中的无点函数

转载 作者:行者123 更新时间:2023-12-01 13:25:31 24 4
gpt4 key购买 nike

我一直在研究 >>= 与列表的用法(当被视为 monad 时)。在一篇文章中All about monads我发现列表的以下标识:l >>= f = concatMap f l,其中 l 是一个列表,f 是一些(一元)功能。我尝试了将列表的每个元素加倍的简单示例并得出以下结果:

let double :: Int -> [Int]
double = (flip (:) []) . (2*)
let monadicCombination :: [Int]
monadicCombination = [1,2,3,4,5] >>= double

我特别希望double 函数以point-free 方式编写。你能想出更简单的 double 实现,以便它仍然可以与 >>= 一起使用吗?

最佳答案

Sassa NF 的回归。 (*2) 既简短又演示了示例的一个有趣原理。如果我们内联整个事情,我们会得到

list >>= double
list >>= return . (*2)

模式 \f l -> l >>= return 。 f 很常见,有自己的名字:liftM

liftM :: Monad m => (a -> b) -> m a -> m b
liftM f m = m >>= return . f

事实上,liftM 等同于 fmap,在提到列表时通常简称为 map:

list >>= return . (*2)
liftM (*2) list
fmap (*2) list
map (*2) list

关于haskell - 单子(monad)绑定(bind)中的无点函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21883024/

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