简化Monad

时间:2013-07-25 18:38:43

标签: python haskell monads

我正在尝试理解也许 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时中止,该怎么办?有什么建议吗?

1 个答案:

答案 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))