在Haskell中编写平均函数

时间:2016-11-07 20:30:45

标签: haskell

1)我正在尝试编写计算三个数字平均值的函数 我写了像

这样的东西
average :: (Float,Float,Float) -> Float 
average x y z = (x+y+z)/3

但由于某种原因它不起作用

有人可以指导我如何编写一个需要3个数字并计算其平均值的函数吗?

2)我从教科书中得到了这个平均功能,但是当我试图运行它时

    average :: [Int] -> Rational
    average [] = error "empty list"
    average xs = toRational (sum xs) / toRational(length xs)

例如,如果我在编译器中输入平均值[1..5] 输出成为 3%1,它不打印值的平均值。

1 个答案:

答案 0 :(得分:0)

  1. 您可以通过两种不同的方式编写3个数字的函数:

    • 具有3个参数的函数,每个参数1个数字
    • 具有1个参数的函数,参数为3个数字(3个数字的元组

    两者都很好,但是你正在混合它们。

    a)3个参数:

    average_3_params :: Float -> (Float -> (Float -> Float))
    average_3_params x y z = (x+y+z)/3
    

    如何阅读:average_3_params是从Float到2个参数的函数的函数,依此类推(请注意,类型中的括号是可选的,我是' m只是迂腐。Float -> Float -> Float -> Float是等同的。)

    b)元组参数

    average_tuple :: (Float, Float, Float) -> Float 
    average_tuple (x, y, z) = (x+y+z)/3
    

    这里,函数有一个参数,但该参数包含3个Float,我们使用模式匹配来提取原始值。

  2. 3 % 1[1..5]的平均值。请注意,您的函数返回Rational,而不是FloatRational是一个分数:将%作为分隔栏阅读。

  3. 一些附注。虽然a)起初看起来有点奇怪,但事实证明它非常方便,因为它可以免费提供部分应用(currying)。关于Float,您应该使用Double [0]。

    [0] https://wiki.haskell.org/Performance/Floating_point