我正在苦苦掙扎着榆樹缺乏monad。一個實現Elm狀態monad的庫(http://package.elm-lang.org/packages/folkertdev/elm-state/latest/State)對我有很大的幫助。如何在Elm中結合結果和狀態?
問題是,現在我遇到了交替嵌套Result和狀態類型的情況,當時我只想每個都有一個。
我試着用下面的簽名寫一個函數,但似乎不可能,因爲只有在評估外部狀態時纔會知道內部結果。
join : Result a (State s (Result a (State s x))) -> Result a (State s x)
也許如果我把結果國家內部的返回值,將工作,但會產生的情況下,一個虛擬的國家外的結果是Err
。
我認爲正確的想法是做出既是結果又是狀態的東西。熟悉Haskell monad變形金剛的人可以解釋他們如何解決這類問題或提出替代解決方案嗎?
這裏是一個粗略的版本,一個地方的問題出在哪裏出現了:
generateConstraints environment value
|> Result.map (State.map (\(value, valueC) ->
Result.map
(State.map2 (\this (body, bodyC) ->
(this
, valueC++ bodyC++ [(this, body)]
))
freshTypevar)
(generateConstraints (extend environment name value) body))
)
當你混合使用相同類型的變壓器時,Monad變壓器是一種痛苦。我通常使用monad類型類,但是當類型出現多次時會失敗。對此的解決方案是新建您所需的特定環境。 –
我並不需要多次擁有相同的monad。我包含的代碼片段是'generateConstraints'的一種情況,它返回'Result String(State Int(Type,List Constraint))'。遞歸工作正常,但是約束生成有一些不同之處,因爲綁定會混淆monad。 – Joonazan
我還是不知道如何將狀態和可能的錯誤結合起來,但是我給出的具體例子奇蹟般地解決了它自己,因爲我能夠將所有特殊的結果排除在外。 – Joonazan