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 个参数 - Sum
和 x
。您可以将其修复为 \(Sum x) -> [Sum x]
甚至 ( : [])
.
我正在尝试使用下面的代码在 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 个参数 - Sum
和 x
。您可以将其修复为 \(Sum x) -> [Sum x]
甚至 ( : [])
.