好了,我已經找到了如何使用operational
包來實現Reader
(和ReaderT
,未顯示):如何使用免費monads實現Reader?
{-# LANGUAGE GADTs, ScopedTypeVariables #-}
import Control.Monad.Operational
data ReaderI r a where
Ask :: ReaderI r r
type Reader r a = Program (ReaderI r) a
ask :: Reader r r
ask = singleton Ask
runReader :: forall r a. Reader r a -> r -> a
runReader = interpretWithMonad evalI
where evalI :: forall b. ReaderI r b -> (r -> b)
evalI Ask = id
但我想不出我的生活如何與免費單子做到這一點(我正在使用Edward Kmett的free
包)。我已經得到最接近的是這樣的,我的理解是欺騙(講講((->) r)
如何已經是一個單子):
import Control.Monad.Free
type Reader r a = Free ((->) r) a
ask :: Reader r r
ask = Free Pure
runReader :: Reader r a -> r -> a
runReader (Pure a) _ = a
runReader (Free k) r = runReader (k r) r
-- Or, more simply and tellingly:
--
-- > runReader = retract
即使這不是啞巴,因爲我懷疑它是,它不是我因爲我想要的,基本上,是能夠檢查Reader
作爲數據...
我不認爲這可以在沒有函數類型的地方完成。 – 2013-03-15 08:23:34