Ответ 1
Вы очень близки, но подпись 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))