Реализация шоу для государства - PullRequest
0 голосов
/ 12 сентября 2018

Ну, эта тема уже обсуждалась раньше, поэтому я ссылаюсь на нее.

Предыдущий вопрос stackoverflow

Так что я уверен, что он работал в то время,но время изменилось:)

Будучи новичком в 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 такжеПонимание того, как: информация Состояние должно интерпретироваться.

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 голосов
/ 12 сентября 2018

Я создал пакет 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, но естьмножество обучающих программ, плавающих в Интернете для этого типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...