gpt4 book ai didi

haskell - 在列表中移动并保持状态

转载 作者:行者123 更新时间:2023-12-04 17:21:29 25 4
gpt4 key购买 nike

我正在尝试将此伪代码转换为 Haskell:

function whatever(list)
int somestate
foreach list as item
if item === 1
state++
else
state--
endforeach
return state

现在这样的事情显然是错误的(状态为 3):

test :: [Int] -> Int
test item
| head item > 1 = 1
| otherwise = newItem
where newItem = tail item

在 Haskell 中实现此类目标的最佳方法是什么?

最佳答案

您可以简单地通过对函数使用另一个参数来做到这一点:

test [] counter = counter
test (x:xs) counter
| x == 1 = test xs (counter + 1)
| otherwise = test xs (counter - 1)

这里我们使用模式匹配(x:xs)将链表头绑定(bind)到x,链表尾绑定(bind)到xs。一旦我们到达空列表,我们就会返回最终的计数器。

我们必须用一个初始计数器调用这个函数,像这样

测试[1..3] 0

但是,我们可以更好地做到这一点,因为不必传入初始计数器,而是在执行过程中累积计数器,就像这样。

test [] = 0
test (x:xs)
| x == 1 = test xs + 1
| otherwise = test xs - 1

这一次,每次值等于一时,我们在空列表上的函数结果中加一。最终我们会遇到基本情况,即 0,其余的值将相加得到最终值。

然而,这种在列表上递归并做一些有值(value)的事情的模式是很常见的。我们可以使用折叠:

test = foldl' (\acc x -> if x == 1 then acc + 1 else acc - 1) 0

这本质上是我们之前的递归函数。

有一些方法可以在 Haskell 中存储持久状态,但通常我们在这种简单的情况下不需要它们。

关于haskell - 在列表中移动并保持状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47371722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com