gpt4 book ai didi

haskell - 在 Haskell 中编写以下程序的更好方法

转载 作者:行者123 更新时间:2023-12-03 15:12:12 24 4
gpt4 key购买 nike

我正在编写一个减少自由词的函数。可以将其视为以下算法:

这个想法是取消列表中的项目,如果它们彼此为负并且彼此相邻。重复应用它,直到没有更多可以取消。例如
[-2,1,-1,2,3] -> [-2,2,3]->[3]

我写了以下代码。看起来并不优雅。多次使用head、tail,这个函数的输入共有3个pattern,如果能减少到2个就好了。
我想知道是否有更优雅的方式在 Haskell 中编写它。我怀疑我可以为此使用 fold ,但我不知道如何自然地做到这一点。

freeReduce []  = []
freeReduce [x] = [x]
freeReduce (x:xs)
| x == -(head xs) = freeReduce (tail xs)
| otherwise = if' (rest == [])
[x]
(if' (x == - (head rest)) (tail rest) (x:rest))
where rest = freeReduce xs

最佳答案

这是我能做到的最清楚的:

freeReduce []       = []
freeReduce (x : xs) = case freeReduce xs of
y : ys | y == -x -> ys
ys -> x : ys

或等效地:
freeReduce = foldr f []
where f x (y : ys) | y == -x = ys
f x ys = x : ys

(两者都未经测试。)

看来 freeReduce本质上是严格的。

(我原来的错误尝试:
freeReduce (x : y : rest) | x == -y =     freeReduce rest
freeReduce (x : rest) = x : freeReduce rest
freeReduce [] = []

(未经测试。))

关于haskell - 在 Haskell 中编写以下程序的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6476319/

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