如何创建Haskell函数,返回整数列表中的每个第三个元素(How to create Haskell function that returns every third element from a

编程入门 行业动态 更新时间:2024-10-27 01:27:50
如何创建Haskell函数,返回整数列表中的每个第三个元素(How to create Haskell function that returns every third element from a list of ints)

我想创建一个函数,从int的列表返回每个第三个int而不使用任何预定义的函数。 例如, everyThird [1,2,3,4,5] --> [1,4]

everyThird:: [a] -> [a]

我可以继续使用tail迭代列表并每隔三次调用追加到一个新列表吗? 我是Haskell的新手并且对所有这些感到非常困惑

I want to create a function that returns every third int from a list of ints without using any predefined functions. For example, everyThird [1,2,3,4,5] --> [1,4]

everyThird:: [a] -> [a]

Could I just continue to iterate over the list using tail and appending to a new list every third call? I am new to Haskell and very confused with all of this

最满意答案

你想要完全按照你所说的做法:遍历列表并仅在每次第三次调用时包含元素。 但是,有一个问题。 Haskell是一种有趣的语言,其中“改变”变量的想法没有意义,所以通常的方法是“有一个反向变量i告诉我们我们是否在第三个元素上”将不起作用通常的方式。 相反,我们将创建一个递归辅助函数来维护我们的计数。

everyThird :: [Int] -> [Int] everyThird xs = helper 0 xs where helper _ [] = [] helper 0 (x : xs) = x : helper 2 xs helper n (_ : xs) = helper (n - 1) xs

我们在帮手中有三个案例。

如果列表为空,请停止并返回空列表。 如果计数器为0(即,如果我们在第三个元素上),则创建一个以当前元素开头并以其余计算结束的列表。 如果计数器不为零,则倒计时并继续迭代。

由于模式匹配的工作方式,它将按顺序尝试这三个语句。

注意我们如何使用另一个参数作为计数器变量,因为我们不能像在命令式语言中那样改变变量。 另外,请注意我们如何递归地构造列表; 我们永远不会“追加”到现有列表,因为这意味着我们正在改变列表。 我们只是从头开始构建列表,并在第一轮结束时得到正确的结果。

You want to do exactly what you said: iterate over the list and include the element only on each third call. However, there's a problem. Haskell is a funny language where the idea of "changing" a variable doesn't make sense, so the usual approach of "have a counter variable i which tells us whether we're on the third element or not" won't work in the usual way. Instead, we'll create a recursive helper function to maintain the count for us.

everyThird :: [Int] -> [Int] everyThird xs = helper 0 xs where helper _ [] = [] helper 0 (x : xs) = x : helper 2 xs helper n (_ : xs) = helper (n - 1) xs

We have three cases in the helper.

If the list is empty, stop and return the empty list. If the counter is at 0 (that is, if we're on the third element), make a list starting with the current element and ending with the rest of the computation. If the counter is not at zero, count down and continue iteration.

Because of the way pattern matching works, it will try these three statements in order.

Notice how we use an additional argument to be the counter variable since we can't mutate the variable like we would in an imperative language. Also, notice how we construct the list recursively; we never "append" to an existing list because that would imply that we're mutating the list. We simply build the list up from scratch and end up with the correct result on the first go round.

更多推荐

本文发布于:2023-08-02 23:56:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1382446.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:整数   第三个   函数   元素   列表中

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!