4

質問:

  • これはモナドですか?
  • これはエラーモナドの合理的な理解を示していますか?
  • 私は何が欠けていますか?
  • モナドをさらに柔軟にするために、このコードで他に何ができますか?
  • 「戻る」/「結果」/「リフト」の成功/失敗の関係について混乱しています(これらはすべて同じ概念だと思います)。
  • モナドが問題点を解決するのに役立つように、どうすれば問題をより複雑にすることができるでしょうか? 配管を抽象化したので、モナドがここで役立ちます.if result != None他にどのようなタイプの配管を抽象化したいですか?モナド (または「モナドコンビネータ」) はこの痛みをどのように助けますか?

私は少し圧倒されています。

# 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'")
4

1 に答える 1