Haskell 使用 Foldmap 的平均函数

Haskell Average Function using Foldmap

我正在尝试使用下面的代码在 haskell 中编写一个定义“平均”,以便 函数产生输入中所有元素的平均值 collection。这是我目前所拥有的:

> type RunningTotal = (Sum Float, Sum Float)

> getAverage :: RunningTotal -> Float
> getAverage (_, 0) = 0
> getAverage (total, count) = getSum total / getSum count

> average :: Foldable f => f Float -> Float
> average = getAverage . foldMap (\ Sum x -> [Sum x])

我收到错误:

In the pattern: Sum
The lambda expression ‘\ Sum x -> ...’ has two arguments,
but its type ‘Sum t0 -> RunningTotal’ has only one
In the second argument of ‘(.)’, namely ‘(\ Sum x -> [Sum x])’

但如果我重复它,对两者使用相同的参数,我会得到:

• The constructor ‘Sum’ should have 1 argument, but has been given none
    • In the pattern: Sum
      In the expression: \ Sum x -> [Sum x]
      In the second argument of ‘(.)’, namely
        ‘(\ Sum x -> [Sum x], \ Sum x -> [Sum x])’

我做错了什么? 除了最后一行的括号外,请不要更改任何内容。

foldMap 的参数应具有 Float -> RunningTotal 类型。你给出的 lambda (\ Sum x -> [Sum x]) 首先有一个语法错误:你可能是想 \(Sum x) -> [Sum x] (你给出的版本是一个有两个参数的 lambda,第一个被命名为 Sum,第二个 x)。这个更正后的 lambda 的类型 Sum a -> [Sum a] 不是你想要的。

正确的 lambda 是 \x -> (Sum x, Sum 1)

您的函数 \ Sum x -> [Sum x] 现在有 2 个参数 - Sumx。您可以将其修复为 \(Sum x) -> [Sum x] 甚至 ( : []).