我正在尝试理解也许 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时中止,该怎么办?有什么建议吗?
答案 0 :(得分:9)
你非常接近,但bind
的签名是
m a -> (a -> m b) -> m b
所以它“展开”m
并将包含的值传递给下一个函数。你目前有
m a -> ( () -> m b) -> m b
由于你只是忽略val
绑定获取,你应该
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))