10

我试图理解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 时中止怎么办?有什么建议吗?

4

1 回答 1

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))
于 2013-07-25T18:45:40.953 回答