为国家实施表演

时间:2018-09-12 16:50:24

标签: haskell functional-programming

这个话题之前已经讨论过,所以我要链接到它。

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’

不确定我会理解答案,但是感谢您的帮助。

1 个答案:

答案 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等类似)可能很有趣。我将不得不考虑一种明智的方法。

从头开始解释StateStateT可能比合理地解决SO答案要困难得多,但是网上有很多关于这种类型的教程。