gpt4 book ai didi

python - Python 中的错误 monad - 我做对了吗?

转载 作者:太空宇宙 更新时间:2023-11-03 11:34:02 26 4
gpt4 key购买 nike

问题:

  • 这是单子(monad)吗?
  • 这是否证明了对 error monad 的合理理解?
  • 我错过了什么?
  • 我还能用这段代码做些什么来使 monad 更加灵活?
  • 我对成功/失败与“返回”/“结果”/“提升”的关系感到困惑(我认为这些都是相同的概念)。
  • 我们怎样才能使问题变得更复杂,以便 monad 帮助我们解决痛点? monad 在这里有所帮助,因为我们抽象出了 if result != None 管道,我可能想抽象哪些其他类型的管道,以及 monad(或“monad 组合器”)如何解决这个问题?<

我有点不知所措。

# helpers for returning error codes
def success(x): return (True, x)
def fail(x): return (False, x)

# bind knows how to unwrap the return value and pass it to
# the next function
def bind(mv, mf):
succeeded = mv[0]
value = mv[1]

if (succeeded): return mf(value)
else: return mv

def lift(val): return success(val)

def userid_from_name(person_name):
if person_name == "Irek": return success(1)
elif person_name == "John": return success(2)
elif person_name == "Alex": return success(3)
elif person_name == "Nick": return success(1)
else: return fail("No account associated with name '%s'" % person_name)

def balance_from_userid(userid):
if userid == 1: return success(1000000)
elif userid == 2: return success(75000)
else: return fail("No balance associated with account #%s" % userid)

def balance_qualifies_for_loan(balance):
if balance > 200000: return success(balance)
else: return fail("Insufficient funds for loan, current balance is %s" % balance)

def name_qualifies_for_loan(person_name):
"note pattern of lift-bind-bind-bind, we can abstract further with macros"
mName = lift(person_name)
mUserid = bind(mName, userid_from_name)
mBalance = bind(mUserid, balance_from_userid)
mLoan = bind(mBalance, balance_qualifies_for_loan)

return mLoan

for person_name in ["Irek", "John", "Alex", "Nick", "Fake"]:
qualified = name_qualifies_for_loan(person_name)
print "%s: %s" % (person_name, qualified)

输出:

Irek: (True, 1000000)
John: (False, 'Insufficient funds for loan, current balance is 75000')
Alex: (False, 'No balance associated with account #3')
Nick: (True, 1000000)
Fake: (False, "No account associated with name 'Fake'")

最佳答案

这是一个 monad 吗? 请参阅 monad laws :

All instances of the Monad class should obey:

  1. "Left identity": return a >>= f ≡ f a
  2. "Right identity": m >>= return ≡ m
  3. "Associativity": (m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)

(return表示成功,>>=表示绑定(bind))

  1. 留下身份。在您的实现中,这可能是:

    bind(success(x), balance_qualifies_for_loan) == balance_qualifies_for_loan(x) 

    其中 x 是某个值,f 是单子(monad)函数。

  2. 正确的身份。同样,这可能是:

    bind(m, success) == m

    其中 m 是一元值。

  3. 关联性。这可能是:

    bind(bind(m,  userid_from_name), balance_from_userid)) ==
    bind(m, lambda x: bind(userid_from_name(x), balance_from_userid))

所有这些都可以编写为单元测试,以快速检查这些属性是否适用于许多输入值。

缺少什么?

  • 每个 monad 需要不同的 successbind 实现。将它们放入一个接口(interface)中将使您能够为所有已实现的 monad 编写通用代码。
  • 基于 the Haskell approach ,您可能想要实现一些通用的 monad 组合器,例如 >>sequencemapM。这些使得 monads 使用起来非常方便。

关于python - Python 中的错误 monad - 我做对了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10003876/

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