假设我想取一个浮点值列表的平均值,那么在某些时候我需要使用" sum"和"长度" (内置功能)。你能创建一个函数来计算浮点值的任意长度列表的平均值吗?
答案 0 :(得分:1)
您可以使用snow
来构建一个元组,其中包括项目的运行计数以及运行总和,然后除以得到平均值。
foldl'
使用data StrictPair a b = StrictPair !a !b
myAvg :: Fractional a => [a] -> a
myAvg [] = error "Empty list"
myAvg list =
let
tupleSum (StrictPair count sum) x = StrictPair (count + 1) (sum + x)
StrictPair totalCount totalSum = foldl' tupleSum (StrictPair 0 0) list
in
totalSum / totalCount
和foldl'
强制评估以避免内存问题。 (感谢您的推荐,@ Jubobs,@ Zeta和@dfeuer!)
答案 1 :(得分:1)
不,一般来说这基本上是不可能的。计算数字列表的平均值需要加法和除法。为Rational
等标准类型计算这些函数的函数是“内置的”。