标签: state-monad

"实例显示状态"不编译

这是我试图弄清楚的State Monad代码

data State a = State (Int -> (a, Int)) 
instance Monad State where
    return x = State (\c -> (x, c))     
    State m >>= f = State (\c ->
        case m c of { (a, acount) ->
            case f a of State b -> b acount})

getState = State (\c -> (c, c))
putState count = State (\_ -> ((), count))

instance Show State where  -- doesn't work
    show (State a) = show a   -- doesn't work
Run Code Online (Sandbox Code Playgroud)

我努力使国家作为展会的实例,这样我可以看到的动作 …

monads haskell state-monad

2
推荐指数
2
解决办法
1096
查看次数

混合 Threepenny-Gui 和 StateT

我有一个关于 Threepenny-Gui 与 StateT 交互的问题。考虑这个玩具程序,每次单击按钮时,都会在列表中添加一个“Hi”项:

import           Control.Monad
import           Control.Monad.State

import qualified Graphics.UI.Threepenny      as UI
import           Graphics.UI.Threepenny.Core hiding (get)

main :: IO ()
main = startGUI defaultConfig setup

setup :: Window -> UI ()
setup w = void $ do
  return w # set title "Ciao"
  buttonAndList <- mkButtonAndList
  getBody w #+ map element buttonAndList

mkButtonAndList :: UI [Element]
mkButtonAndList = do
  myButton <- UI.button # set text "Click me!"
  myList <- UI.ul
  on UI.click myButton $ \_ -> element myList …
Run Code Online (Sandbox Code Playgroud)

haskell state-monad monad-transformers threepenny-gui

2
推荐指数
1
解决办法
292
查看次数

如何从输入文件流式传输到具有状态的管道

我想使用管道从文件中读取,然后将其流式传输到tokenizer.罪魁祸首是,即使是相同的字符序列也可能会产生不同的令牌,具体取决于之前的输入.

所以,我怎么能处理State单一Conduit其间一堆IO的?

只是写入Conduit Char (State TokenizerStateType) Token会产生错误类型的几个错误(IO想要,State得到错误类型).

由于我不在自己的计算机上,所以我不能提供一个不工作的最小例子,但是只要我有ghc,我就会添加一个.

haskell state-monad monad-transformers conduit io-monad

2
推荐指数
1
解决办法
121
查看次数

如何在状态monad的字段上匹配匹配?

是否可以a使用pattens匹配/保护写入函数?

{-# LANGUAGE PatternGuards #-}
import Control.Monad.State.Strict(State, gets, runStateT)
data MyState = MyState
    { counter :: Int
    } deriving (Show)


a :: State MyState String
a = do
    i <- gets counter
    case i of
        0 -> return "hello"
        1 -> return "bye"

run = runStateT a ( MyState{counter=0} )
Run Code Online (Sandbox Code Playgroud)

我试着写a

a' :: State MyState String
a' | i <- gets counter, i == 0 = return "hello"
Run Code Online (Sandbox Code Playgroud)

但得到了错误:

No instance for (Control.Monad.State.Class.MonadState MyState m0)
  arising …
Run Code Online (Sandbox Code Playgroud)

haskell pattern-matching state-monad pattern-guards

2
推荐指数
1
解决办法
409
查看次数

如何使用状态monad编写这个简单的代码?

我是Haskell的初学者,我遇到过我想使用状态monad的情况.(或者至少,我认为我就是我想要使用的.)状态monad有一百万个教程,但所有这些教程似乎都认为我的主要目标是在深层次的概念层面理解它,并且因此,他们在他们说如何用它实际开发软件的部分之前就停止了.所以我正在寻求一个简化的实际例子的帮助.

下面是我当前代码的简单版本.正如您所看到的,我正在通过我的函数来处理状态,我的问题就是如何使用do符号重新编写代码,这样我就不必这样做了.

data Machine = Register Int

addToState :: Machine -> Int -> Machine
addToState (Register s) a = Register $ s+a

subtractFromState :: Machine -> Int -> Machine
subtractFromState (Register s) a = Register (s-a)

getValue :: Machine -> Int
getValue (Register s) = s

initialState = Register 0

runProgram = getValue (subtractFromState (addToState initialState 6) 4)
Run Code Online (Sandbox Code Playgroud)

代码模拟一个简单的抽象机器,它具有一个寄存器,以及添加到寄存器的指令,从中减去并获取其值.最后的"程序"将寄存器初始化为0,向其中加6,减去4并返回结果,当然为2.

我理解状态monad的目的(或者至少认为我这样做),并且我希望它能让我重新编写这个,这样我最终会得到像

runProgram :: ???????
runProgram = do
    put 0
    addToState 6
    subtractFromState 4
    value <- getValue
    return value
Run Code Online (Sandbox Code Playgroud)

然而,尽管我读过所有教程,但我仍然不太清楚如何将代码转换为这种形式. …

monads haskell state-monad

2
推荐指数
1
解决办法
129
查看次数

Haskell:如何证明(测试)自我定义的Monad实例是否遵循Monad法则?

不使用正式演绎,我如何测试自定义Monad实例是否符合Monad法则?

monads haskell state-monad

2
推荐指数
1
解决办法
127
查看次数

单元的元组(monad,state)?

我正在尝试使用Monads编写一个Haskell"数字猜测"游戏程序,但我被困住了:
我尝试了简单的状态monad:

data SM a = SMN (S -> (a, S))
instance Monad SM where
 SMN c1 >>= fc2 = SMN (\s0 -> let (r, s1) = c1 s0 in
                                let SMN c2 = fc2 r in
                                  c2 s1)
Run Code Online (Sandbox Code Playgroud)

我需要在元组(a,S)的"IO端"执行IO任务,也就是说,我尝试做类似的事情:

SMN c1 >>= fc2 = SMN (\s0 -> let (r, s1) = c1 s0 in
                               let SMN c2 = fc2 r in
                                 let (r1, s2) = c2 s1 in
                                   let r2 = r1 >>= (\_ -> r) in
                                     (r2, s2)) …
Run Code Online (Sandbox Code Playgroud)

io monads haskell state-monad

1
推荐指数
1
解决办法
254
查看次数

如何将有状态计算应用于列表?

让我们想象一下Brainf*ck的虚拟子集:

+ 递增计数器

- 递减柜台

一个简单的程序:

program = "++++--" -- should evaluate to 2

有状态的评估功能:

eval :: Char -> State Int Char
eval '+' = do x <- get
              put (x + 1)
              return 'I'
eval '-' = do x <- get
              put (x - 1)
              return 'D'
Run Code Online (Sandbox Code Playgroud)

你会如何评价该计划?(fold对我来说看起来像是一个但是我无法理解它,并且它感觉不是正确的做法...)

haskell state-monad

1
推荐指数
2
解决办法
127
查看次数

在haskell标记树木

我有一个任意树,并希望将其转换为整数树,原始值应替换为整数.每次出现时都必须用相同的数字替换相同的值.

提供了遍历树的功能,这是我的标签功能

label :: Ord a => a -> State (Store a Int) Int
Run Code Online (Sandbox Code Playgroud)

我相信我需要一个堆栈来存储标签,但我不知道如何应用它,任何指导将不胜感激

monads tree haskell state-monad

1
推荐指数
1
解决办法
406
查看次数

Haskell foldl Monad绑定

我有一个功能

move :: Move -> Node -> Maybe Node
Run Code Online (Sandbox Code Playgroud)

在哪里我可以使用我的绑定monad来获得一个Maybe Node

(return n >>= move m) 
Run Code Online (Sandbox Code Playgroud)

其中n :: Node和m :: Move,但我现在如何折叠Moves([Move])列表?

我尝试用foldl做但没有成功.

haskell fold state-monad

1
推荐指数
1
解决办法
222
查看次数