【发布时间】:2020-08-29 10:50:32
【问题描述】:
我有一个输入 [String] 如下:
main = do
let res = calcCounts ["IOIOOIOOI\r","OOIIIOOO\r",...]
我想使用非统一的基本系统按顺序计数I 和O 实例。
我创建了一个Type:
data OutputState = OutputState { totNumI :: Int,
totNumO :: Int,
numI :: Int,
numO :: Int
} deriving (Show)
到目前为止,我创建的代码尝试单步执行输入并每次创建一个新的OutputState,同时考虑之前的OutputState,然后再达到每个[Char] 的完整条件'\r' 和[String] 的列表末尾但不完整:
calcCounts :: [String] -> [OutputState]
calcCounts input = map genOutputState input
genOutputState :: [Char] -> OutputState
genOutputState (x:xs)
| x == '\r' = --return final OutputState
| otherwise do
let currOutputState = incrementOutputState x
genOutputState xs --also pass current OutputState back each recursion
incrementOutputState :: OutputState -> Char -> OutputState
incrementOutputState pos@prevOS x = do
| if x == 'I' = do
let currOutputState = OutputState pos{totNumA} pos{totNumB} pos{numA}+1 pos{numB}
| if currOutputState{numA} == 4 = OutputState currOutputState{totNumA}+1 currOutputState{totNumB} 0 0
| otherwise = do
let currentOutputState = OutputState pos{totNumA} pos{totNumB} pos{numA} pos{numB}+1
| if currentOutputState{numB} == 4 = OutputState currOutputState{totNumA} currOutputState{totNumB}+1 0 0
最终输出应该是[OutputState,OutputState,..]
我知道我的代码目前不合法并且缺少逻辑。对此表示歉意。总的来说,我仍在回归 Haskell 和函数式编程。在命令式范例中,我会使用可变变量来跟踪必要的计数,但要理解这不是从功能意义上考虑问题的正确方法。
非常感谢任何帮助!
【问题讨论】:
-
我不太明白你到底想做什么。您能否详细说明
totNumA和numA之间的区别?genOutputState "IOIOOIOOI\r"的结果应该是什么? -
pos{totNumA} pos{totNumB} pos{numA}+1 pos{numB}无效。例如,您只需在pos@OutputState {totNumA=a, totNumB=b}上进行模式匹配,然后在表达式中写入pos {totNumA = a+1}。 -
对@RikVanToor 感到抱歉,所需的输出将是
[OutputState,OutputState,..],例如,内容将是{ totNumI=1, totNumO=1, numI=0, num0=0 }。我已将OutputState从 As 和 Bs 更改为 Is 和 Os 以更有意义。 -
感谢@WillemVanOnsem,我明白你的意思,但我的语法很弱。我在使用
OutputState时遇到了很多麻烦。例如,它当前没有从genOutputState传递到incrementOutputState,因为递归会导致let currOutputState = incrementOutputState (OutputState 0 0 0 0) x为Char中的每个OutputState重置OutputState。 -
不清楚你想做什么。我认为只是计算列表中的相等元素。只是,使用
Data.Map作为累加器和insertwith (+)作为函数折叠列表应该可以工作。我没有得到不统一的基础
标签: haskell recursion functional-programming conditional-statements immutability