gpt4 book ai didi

haskell - 从列表中删除 n 个元素

转载 作者:行者123 更新时间:2023-12-02 07:27:25 24 4
gpt4 key购买 nike

我今年的模块之一是 Haskell 编程。我无法以如此简单的方式表达复杂性,尤其是来自 C# 等其他语言时。

部分熟悉过程涉及我们实现一个 drop' 函数,该函数从列表中删除 n 个元素。

写一个函数 drop’::Int -> [a] -> [a],其中 drop’ n xs 返回 xs 的前 n 个元素被移除。

到目前为止,我想到的是这个。

drop' :: Int -> [a] -> [a]
drop' x [] = []
drop' x (y : ys) = if x == 0 then ys else drop' (x-1) ys

我知道我需要在列表的尾部递归调用 drop' 以有效地删除一个元素,但我不知道如何计算我删除了多少元素,这样我才能确保我删除了 n 个元素。

我知道上面没有给我预期的结果,因为它比我预期的多删除了 1 个,但有趣的是,它有效:

drop' :: Int -> [a] -> [a]
drop' x [] = []
drop' x (y : ys) = if x == 1 then ys else drop' (x-1) ys

我无法推断出原因!任何对此逻辑的帮助将不胜感激!

最佳答案

在您的代码中:

drop' x (y : ys) = If x == 0 then ys else drop' (x-1) ys  

这是您的差一错误的来源:如果 x 为 0,您希望返回整个列表不变 (y:ys),而不是只是尾部 (ys)。同样,您可以检查 1 而不是 0,然后返回 ys

使用模式匹配而不是 if 会更符合习惯,您应该使用 _ 无关变量来表示您不关心的值使用:

drop' :: Int -> [a] -> [a]
drop' _ [] = [] -- dropping any number of items from [] is still empty
drop' 0 lst = lst -- dropping nothing returns the list unchanged
drop' n (_:xs) = drop' (n-1) xs -- otherwise remove head and recurse on the tail

关于haskell - 从列表中删除 n 个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508740/

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