【发布时间】:2020-08-28 18:23:10
【问题描述】:
我想创建一个系统,该系统必须跟踪不断变化的状态才能发现结果。输入数据的格式是我分解成字符的字符串列表。
例如 ['ynnynyy','ynynyn',...]
在命令式风格中,逻辑如下:
yCount=0,xCount=0,yTotal=0,nTotal=0
for x in input:
for y in x:
if y is 'y':
yCount++
else:
nCount++
if yCount is 10:
yTotal++
if nCount is 10:
nTotal++
if yCount is 10 or nCount is 10:
yCount=0
nCount=0
可变变量的使用让我很难将模式转换为 Haskell。
我目前正在尝试使用嵌套函数创建解决方案:
main = do
parseInputData input
parseInputData :: [String] -> IO () --would like to write solution to file
parseInputData x = do
let result = map getSingleValue (lines input)
getSingleValue :: [Char] -> String --would like to return string representation of outcome
getSingleValue (x:xs)
| x == 'y' .. --update state and continue
| x == 'n' .. --update state and continue
| otherwise .. --return final state
我对 Haskell 语法和一般的函数式编程非常生疏并且缺乏实践。我知道 State monad,但不确定如何正确实现它。
任何分享的想法可以让我朝着正确的方向前进,或者帮助我调整我的思路,这有点卡在命令式中,我可以提出解决方案!
非常感谢任何帮助!
【问题讨论】:
-
不需要状态单子。只需使用列表递归并将状态变量作为参数传递。或者创建一个包含所有四个的记录,并将该记录作为单个值传递。或者然后将其与折叠一起使用。
-
看来您本质上是想计算 y 和 n 的数量。为此,您只需将
concat的字符列表合并为一个,将filter的列表合并为相应的字符,然后取length。大多数此类问题通常都有纯粹的功能解决方案,您不应该将状态作为第一冲动。 -
您好,感谢您的意见。数组的每个元素都需要分别计算 ys 和 ns。每个元素的 ys 和 ns 的顺序也很重要。
标签: haskell recursion functional-programming state monads