我有一個代碼,適用於一個monad,它有一定的狀態。 我遇到了問題,因爲狀態有一個需要monad的類型變量。當一個類型包含它自己時該怎麼辦?
它看起來像:
myget :: MonadState (MyState m A) m => m A
現在,當我嘗試,使之更加具體,有一個問題。例如。只是StateT
(一些內部單子im
):
myget' :: StateT <loops here> im A
myget' :: StateT (MyState <loop> A) im A
myget' :: StateT (MyState (MyState <loop> A) A) im A
myget' :: StateT (MyState (MyState (MyState <loop> A) A) A) im A
...
myget' = myget
所以,很顯然,我不能寫這種類型的簽名;我甚至不能把它留給類型推理。
我該如何解決這個問題?
我確實通過使myget
(第一個常規定義)在monad變換器上工作來解決問題,而且它確實有效,但是代碼與其他任何東西都不能很好地配合使用(因爲通常人們會使用monads變形金剛就像monads),所以它不是一個很好的解決方案。
任何想法?
http://www.haskellforall.com/2012/06/you-could-have-invented-free-monads.html – arrowd
是什麼'MyState'的樣子,順便說一下? – dfeuer
你可以用'MonadState(MyState MSM A)MSM'的行來定義你自己的monad,'MSM'嗎? –