这个话题之前已经讨论过,所以我要链接到它。
Previous stackoverflow question
所以我确定它在当时是可行的,但是时间已经改变了:)
作为Haskell新手迈出的小步,这将使我更进一步。 我尝试了各种解决方案,解决了各种问题。
建议的解决方案
instance Show a => Show (State a) where
show (State f) = show [show i ++ " => " ++ show (f i) | i <- [0..3]]
编译器报告。
myfuncs.hs:31:11: error:
Not in scope: data constructor ‘State’
Perhaps you meant one of these:
‘StateT’ (imported from Control.Monad.State),
variable ‘state’ (imported from Control.Monad.State)
|
31 | show (State f) = show [show i ++ " => " ++ show (f i) | i <- [0..3]]
|
我将感谢State State和StateT的移植 也了解:info状态如何解释。
type State s = StateT s Data.Functor.Identity.Identity :: * -> *
-- Defined in ‘Control.Monad.Trans.State.Lazy’
有关信息的相同问题:状态
class Monad m => MonadState s (m :: * -> *) | m -> s where
...
state :: (s -> (a, s)) -> m a
-- Defined in ‘Control.Monad.State.Class’
不确定我会理解答案,但是感谢您的帮助。
答案 0 :(得分:2)
我已经构建了universe软件包,目的是在小型域上显示功能(以及其他功能)。您可以使用它通过以下方式为Show
创建一个State
实例:
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE UndecidableInstances #-}
import Control.Monad.State
import Data.Universe
import Data.Universe.Instances.Reverse
deriving instance (Finite s, Show s, Show (m (a,s))) => Show (StateT s m a)
尝试一下:
> modify not :: State Bool ()
StateT {runStateT = [(False,Identity ((),True)),(True,Identity ((),False))]}
在ReaderT
包中包含这样的内容(与universe-reverse-instances
等类似)可能很有趣。我将不得不考虑一种明智的方法。
从头开始解释State
和StateT
可能比合理地解决SO答案要困难得多,但是网上有很多关于这种类型的教程。