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,它不打印值的平均值。
答案 0 :(得分:0)
您可以通过两种不同的方式编写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
,我们使用模式匹配来提取原始值。
3 % 1
是[1..5]
的平均值。请注意,您的函数返回Rational
,而不是Float
。 Rational
是一个分数:将%
作为分隔栏阅读。
一些附注。虽然a)起初看起来有点奇怪,但事实证明它非常方便,因为它可以免费提供部分应用(currying)。关于Float
,您应该使用Double
[0]。