2016-11-07 160 views
-3

1)我想写函数计算三个数字 平均我写了类似写平均函数在Haskell

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

但它不会因为某种原因

能工作的人指导我如何编写一个需要3个数字并计算其平均值的函数?

2)我从教科书这个平均函数但是当我试图例如,如果我进入在编译器中平均[1..5]来运行它

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

输出成为 3% 1,它不打印数值的平均值。

+3

第一功能应该是'平均(X,Y,Z)= ..'或'平均::浮法 - >浮动 - >浮 - > Float'。第二个函数确实有效......'[1..5]'的平均值实际上是3.有理数3在Haskell中被打印为“3%1”(或3以上)。 – user2407038

+1

@ user2407038这是一个答案,而不是评论。 – chepner

回答

0
  1. 有两种不同的方式,你可以写3个数字的功能:

    • 有3个参数,每个参数1号
    • 用1个参数的函数的函数,参数为3数字(一个元组的3个数字)

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

    一个)3个参数:

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

    如何阅读本是:average_3_params是从Float的功能的2个参数的函数,等等(注意,在该类型的括号是可选的,我只是迂腐。Float -> Float -> Float -> Float是等同的)。

    b)中的元组参数

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

    在此,函数具有一个参数,但参数包含3个Float S和我们使用模式匹配以提取原始的值。

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

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

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