Haskell——试图让我的折叠函数工作



我有一个函数,可以将 [a, b, c, d, . . ] 转换为 [(a,b), (c, d), . . . . ]。现在这有效,这是代码:

makeTuple :: [a] -> [(a,a)]
makeTuple [] = []
makeTuple [a] = []
makeTuple (x:y:xs) = (x,y): (makeTuple xs)

现在我要做的下一件事是:使用前面的函数,使用 foldl 和 lambda 表达式将每个元组转换为其两个元素的乘积。这就是我所拥有的:

productTuple [x] = foldl makeTuple [] [x]

现在我不确定这是否正是对我的要求。我不确定我是否应该使用类型声明和其他东西创建一个单独的函数。也许有人可以告诉我这是否是解决这个问题的最佳方式。此外,这段代码不起作用,我不知道为什么,我需要这部分的帮助。 (请注意,它说要使用lambda,但我不知道如何真正正确使用这些,这是我需要帮助的另一部分) 我将不胜感激,谢谢。

lambda 函数应遵循此签名:

 [a] -> (b,b) -> [a]

累加器的类型为 [a],元组的类型为 (b,b)

你可以试试这样的lambda acc (a, b) -> acc++[a*b]

最后一个函数可能看起来像:

productTuple :: Num a => [a] -> [a]
productTuple xs = foldl (acc (a, b) -> acc++[a*b]) [] (makeTuple xs)

这里有一些折叠函数的例子

我在这里尝试了这段代码

该练习要求您使用 makeTuple 预处理输入列表,然后折叠它。

productTuple :: [Int] -> [Int]
productTuple xs = foldl (some lambda) something (makeTuple xs)

这不是最方便的方法,但我想练习的目的是强迫你仅仅为了它而使用foldl

最新更新