gpt4 book ai didi

python - 简化 Monad

转载 作者:太空狗 更新时间:2023-10-29 18:30:44 25 4
gpt4 key购买 nike

我正在尝试理解也许 Monad但是我看到的大多数示例都使用了一些特定于语言的功能。为了确保我在概念上是正确的,我想到了编写一个通用的实现。以下是我想出的。

有人能告诉我我的概念是否正确吗?有没有更好的泛化方法?

def f():
return 2

def g():
return 4

def h():
return 7

def i():
return None

def bind(val, func):
if val is None:
return None
else:
return(func())

unit = 0

>>> bind(bind(bind(unit,f),i),h) #Returns nothing
>>> bind(bind(bind(unit,f),g),h) #Returns a value
>>>7

如果我想从这些函数中添加值并在其中任何一个为 NULL 时中止怎么办?有什么建议吗?

最佳答案

你非常接近,但是 bind 的签名是

m a -> (a -> m b) -> m b

所以它是“展开”m 并将包含的值传递给下一个函数。你目前有

m a -> ( () -> m b) -> m b

因为你只是忽略了 val 绑定(bind)获取,你应该有

def bind(val, func):
if val is None:
return None
else:
return(func(val))

这等同于 Haskell 中的 >>=。您之前拥有的是 >>> 应该实现为

# "ignore" bind
def ibind(val, func):
bind(val, lambda _ : func())

它只是愉快地丢弃了 bind 传递给它的值。

要更进一步,您必须引入一个类

class Maybe():
def __init__(v):
self.val = v
self.isNothing = False
Nothing = Maybe(None)
Nothing.isNothing = True

def bind(val, func):
if val.isNothing:
return Nothing
else:
return(func(val.val))

关于python - 简化 Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17866148/

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