2 回答
TA貢獻2041條經驗 獲得超4個贊
那個of電話arrFold似乎有點不合適。
我不確定您arrFold是右折疊還是左折疊,但假設它是右折疊,您將需要像在遞歸實現中一樣使用帶有閉包的延續傳遞樣式:
varArgs(ms => of(arrFold(g => mx => chain(mx) (g)) (f) (ms)))
變成
varArgs(ms => arrFold(go => mx => g => chain(mx) (x => go(g(x)))) (of) (ms) (f))
用左折疊,你可以寫
varArgs(arrFold(mg => mx => chain(g => map(g) (mx)) (mg)) (of(f)))
但您需要注意,這構建了與正確折疊不同的調用樹:
of(f)
chain(of(f))(g0 => map(m0)(g0))
chain(chain(of(f))(g0 => map(m0)(g0)))(g1 => map(m1)(g1))
chain(chain(chain(of(f))(g0 => map(m0)(g0)))(g1 => map(m1)(g1)))(g2 => map(m2)(g2))
vs(已經應用了延續)
of(f)
chain(m0)(x0 => of(f(x0)))
chain(m0)(x0 => chain(m1)(x1 => of(f(x0)(x1))))
chain(m0)(x0 => chain(m1)(x1 => chain(m2)(x2) => of(f(x0)(x1)(x2)))))
根據 monad 定律,它們的評估結果應該相同,但在實踐中,一個可能比另一個更有效率。
添加回答
舉報
