这是我试图弄清楚的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)
我努力使国家作为展会的实例,这样我可以看到的动作 …
我有一个关于 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) 我想使用管道从文件中读取,然后将其流式传输到tokenizer.罪魁祸首是,即使是相同的字符序列也可能会产生不同的令牌,具体取决于之前的输入.
所以,我怎么能处理State单一Conduit其间一堆IO的?
只是写入Conduit Char (State TokenizerStateType) Token会产生错误类型的几个错误(IO想要,State得到错误类型).
由于我不在自己的计算机上,所以我不能提供一个不工作的最小例子,但是只要我有ghc,我就会添加一个.
是否可以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的初学者,我遇到过我想使用状态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)
然而,尽管我读过所有教程,但我仍然不太清楚如何将代码转换为这种形式. …
不使用正式演绎,我如何测试自定义Monad实例是否符合Monad法则?
我正在尝试使用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) 让我们想象一下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对我来说看起来像是一个但是我无法理解它,并且它感觉不是正确的做法...)
我有一个任意树,并希望将其转换为整数树,原始值应替换为整数.每次出现时都必须用相同的数字替换相同的值.
提供了遍历树的功能,这是我的标签功能
label :: Ord a => a -> State (Store a Int) Int
Run Code Online (Sandbox Code Playgroud)
我相信我需要一个堆栈来存储标签,但我不知道如何应用它,任何指导将不胜感激
我有一个功能
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做但没有成功.