【问题标题】:Haskell-- Trying to make my foldl function workHaskell——试图让我的 foldl 函数工作
【发布时间】:2017-11-02 07:58:10
【问题描述】:

我有一个函数可以转换 [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,但我不知道如何真正正确地使用它们,这是我需要帮助的另一部分)我将不胜感激,谢谢。

【问题讨论】:

  • 谁说你必须使用你的makeTuple函数?
  • 你可能要实现productTuple的empty和cons case,所以productTuple (x:xs)productTuple []
  • 提示:您将如何使用foldl 将列表作为输入来重新创建该列表(所以基本上是id 函数)?

标签: function haskell lambda tuples foldleft


【解决方案1】:

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)

你有一些foldl function here的例子

I tried this code here

【讨论】:

    【解决方案2】:

    练习要求您使用makeTuple 预处理输入列表,然后将其折叠起来。

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

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

    【讨论】:

    • 您使用 OP 的 makeTuple 会导致类型错误:它只需要一个列表作为参数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-29
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多