【发布时间】:2015-02-17 10:41:21
【问题描述】:
我是 Haskell 的新手,所以我试图了解高阶函数以及它们如何使用 map、filter、foldr、foldl、foldr1、foldl1 和 operator 工作。
首先我想从一个函数开始,该函数将列表中的元素相乘,然后将一个空列表相乘返回 1。
到目前为止,我有这个,但我不确定下一步该去哪里。
mult :: [Int] -> Int
【问题讨论】:
标签: haskell
我是 Haskell 的新手,所以我试图了解高阶函数以及它们如何使用 map、filter、foldr、foldl、foldr1、foldl1 和 operator 工作。
首先我想从一个函数开始,该函数将列表中的元素相乘,然后将一个空列表相乘返回 1。
到目前为止,我有这个,但我不确定下一步该去哪里。
mult :: [Int] -> Int
【问题讨论】:
标签: haskell
首先从显式递归开始...这意味着不要使用 foldl/foldr 和朋友。
让我们从处理空列表的极端情况开始:
mult [] = 1
现在,我们可以对列表的第一个元素做一些事情:
mult (x:xs) = x * 3
x 是列表的第一个元素,而xs 是剩余的列表。所以这只是将列表的 first 元素乘以 3。
现在你必须弄清楚用什么替换 3 才能让整个事情做你想做的事。其余的已经正确,如:
mult :: [Int] -> Int
mult [] = 1
mult (x:xs) = x * <this part is missing, recursion maybe?>
【讨论】:
你应该处理空列表的情况:
mult [] = ?
那么,你想做什么?你想基本上列出一个清单:
[1, 2, 3, 4]
并在其间插入乘号:
1 * 2 * 3 * 4
我建议您查看how fold works。
【讨论】:
? 放了什么?
? 应该是什么?
mult xs = foldl (*) xs?