微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用状态 monad 时的意外行为 - 状态包裹在列表中

如何解决使用状态 monad 时的意外行为 - 状态包裹在列表中

我现在正在学习 Haskell,我正在尝试与状态 Monad 合作。

我递归地要求用户输入并将其附加到列表中。当我在同一个函数中实现 IO 处理和状态执行时,程序按预期工作:

picture_count

由于我不明白的原因,当我将状态处理函数与 IO 函数分开时,返回的状态是用一个列表包装的:

import Control.Monad.State

push :: String -> State [String] ()
push a = state $ \xs -> ((),a:xs)


testingState :: State [String] ()
testingState = do
  push ("testing state!")
  return ()


handleState :: [String]  -> IO()
handleState prevIoUsstack = do
  line <- getLine
  let userIntput = words line
  let stack = userIntput ++ prevIoUsstack
  let newStack = (execState testingState) stack
  handleState newStack


main :: IO 
main = do
  handleState []

以下代码给了我一个编译器错误,即实际返回的类型是嵌套列表:

handleState :: [String]  -> IO()
handleState prevIoUsstack = do
  line <- getLine
  let newStack = changeState line stack
  handleState newStack

changeState :: String -> [String] -> [String]
changeState line prevIoUsstack = do
  let userIntput = words line
  let stack = userIntput ++ prevIoUsstack
  let newStack = (execState testingState) stack
  return newStack


main = do
  handleState []

另外,我只能在 Couldn't match type ‘[Char]’ with ‘Char’ Expected type: [String] Actual type: [[String]] 函数外部展平数组,在函数内部这样做是行不通的。

谁能解释为什么会这样?以及在递归函数中处理状态的更好方法

解决方法

您在 do 中使用了 returnchangeState。由于 do 块的类型是 [String],它将使用 Monad 类型类的列表实例,这意味着 return :: Monad m => a -> m a 将包装一个元素在列表中。

您可以将 changeState 函数实现为:

changeState :: String -> [String] -> [String]
changeState line previousStack = execState testingState (words line ++ previousStack)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?