gpt4 book ai didi

haskell - 使用 head、tail 和 null 对列表中的元素进行乘积

转载 作者:行者123 更新时间:2023-12-01 14:36:16 26 4
gpt4 key购买 nike

所以基本上我应该使用 head 获取第一个元素并乘以尾部和 null 遍历列表。我是 haskell 的新手,所以我根本不了解流量控制。下面的代码已经可以工作了,我只需要弄清楚在哪里使用 tail 并遍历列表。

module Blueprint where
import Prelude


x=1
prod :: [Integer] -> Integer
prod n
|null n == True = 0
|null n== False = x*head n

添加一些伪代码:

x=1
prod :: [Integer] -> Integer
prod n
|null n == True = 0
|null n== False = x*head n do tail n repeat until null n == true

任何帮助都会很棒。谢谢。

最佳答案

你快搞定了!您只需要递归调用 prod 来获取列表尾部的乘积,然后将列表头部乘以结果。

prod :: [Int] -> Int
prod xs
| null xs = 1
| otherwise = head xs * prod (tail xs) -- note recursive call to prod

顺便说一句,使用模式匹配来解构你的列表比手动调用headtailnull 更符合习惯

prod [] = 1
prod (x:xs) = x * prod xs

希望您能看出这与上面的代码有何等同之处。

Terser 仍然将 prod 表示为 fold:

prod = foldr (*) 1

foldr 是标准的 Haskell 惯用语,一次处理一个列表的一个元素。它是这样定义的:

foldr :: (a -> b -> b) -> b -> [a] -> b
foldr f acc [] = acc
foldr f acc (x:xs) = f x acc (foldr f acc xs)

在该定义中用 * 代替 f,用 1 代替 acc,您将恢复 prod 来自上面。

关于haskell - 使用 head、tail 和 null 对列表中的元素进行乘积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36714461/

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