我很惊讶我找不到任何关于此的信息。我一定是唯一一个遇到麻烦的人。
所以,假设我有一个仪表板。我希望它计算字符串中破折号的数量,并返回字符串。假装我给出了一个使用 parsec 的状态处理不起作用的例子。所以这应该工作:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
char '-'
modify (+1)
事实上,这可以编译。好的,所以我尝试使用它:
:t parse dashCounter "" "----"
parse dashCounter "" "----"
:: (Control.Monad.State.Class.MonadState
t Data.Functor.Identity.Identity,
Num t) =>
Either ParseError (t, [Char])
好吧,这是有道理的。它应该返回状态和字符串。凉爽的。
>parse dashCounter "" "----"
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState
t0 Data.Functor.Identity.Identity)
In the first argument of `parse', namely `dashCounter'
In the expression: parse dashCounter "" "----"
In an equation for `it': it = parse dashCounter "" "----"
哎呀。但是,它怎么可能一开始就希望工作呢?无法输入初始状态。
还有一个功能:
>runPT dashCounter (0::Int) "" "----"
但它给出了类似的错误。
<interactive>:1:7:
No instance for (Control.Monad.State.Class.MonadState Int m0)
arising from a use of `dashCounter'
Possible fix:
add an instance declaration for
(Control.Monad.State.Class.MonadState Int m0)
In the first argument of `runPT', namely `dashCounter'
In the expression: runPT dashCounter (0 :: Int) "" "----"
In an equation for `it':
it = runPT dashCounter (0 :: Int) "" "----"
我觉得我应该在它上面运行状态,或者应该有一个已经在内部完成它的函数,但我似乎无法弄清楚从这里去哪里。
编辑:我应该更清楚地指定,我不想使用 parsec 的状态处理。原因是我有一种感觉,我不希望它的回溯影响我准备解决的问题所收集的内容。
然而,McCann 先生已经想出了这应该如何组合在一起,最终的代码看起来像这样:
dashCounter = do
str <- many1 dash
count <- get
return (count,str)
dash = do
c <- char '-'
modify (+1)
return c
test = runState (runPT dashCounter () "" "----------") 0
非常感谢。