私はより良いモナドを理解しようとしています。 Maybe Monad Correctのこの最小実装は正しいですか?LiveScriptを使用してMonadsを理解しようとしています
Maybe = (value) ->
@value = value
Maybe.prototype.ret = -> @value
Maybe.prototype.bind = (fn) ->
if not (@value is null)
return fn @value
@value
Maybe.prototype.lift = (fn) -> (val) -> new Maybe fn val
また、これが正しい場合、一般化する方法について私が混乱している最終的な機能があります。
Maybe.prototype.lift2 = (fn) -> (M1, M2) ->
f = M1.bind ((val1) -> M2.bind (val2) -> fn val1, val2)
new Maybe f
今どのようにあなたは、lift3ためlift4これを一般化します.... 出典liftn:http://modernjavascript.blogspot.co.uk/2013/06/monads-in-plain-javascript.html
フォローアップの質問:
あなたが私に結合する方法の簡単な例を与えることができますたぶんモナドと別のモナドを使って簡単に 酒は.then
メソッドでプロミスを保つことができます
モナドの本当の有用性はそれらを変えているからです。
class Maybe
({x}:hasValue?) ->
# map :: [Maybe a -> ] (a -> b) -> Maybe b
@map = (f) ->
if !hasValue then Nothing else Just (f x)
# bind :: [Maybe a -> ] (a -> Maybe b) -> Maybe b
@bind = (f) ->
if !hasValue then Nothing else f(x)
# toString :: [Maybe a -> ] String
# note here it's not necessary for toString() to be a function
# because Maybe is can only have either one these values:
# Nothing or Just x
@show =
if !hasValue then 'Nothing' else "Just #{x.toString!}"
# static method
@pure = (x) -> Just x
コンストラクタはoptinal {x}
パラメータを取ります。
'ret'はインスタンスメソッドであってはなりません。 – rightfold