Haskell点运算符

时间:2010-05-14 13:53:45

标签: haskell syntax function-composition

我尝试在Haskell中开发一个简单的平均函数。 这似乎有效:

lst = [1, 3]

x = fromIntegral (sum lst)
y = fromIntegral(length lst)

z = x / y

但是为什么以下版本不起作用?

lst = [1, 3]

x = fromIntegral.sum lst
y = fromIntegral.length lst

z = x / y

3 个答案:

答案 0 :(得分:17)

.(组合)的优先级低于函数应用程序,因此

fromIntegral.sum lst

被解释为

fromIntegral . (sum lst)

这是错误的,因为sum lst不是函数。

答案 1 :(得分:16)

因为运营商的哈斯克尔优先规则让你惹恼了,这让人感到困惑。

写作时

x = fromIntegral.sum lst

Haskell认为与:相同:

x = fromIntegral.(sum lst)

你打算写的是:

x = (fromIntegral.sum) lst

答案 2 :(得分:10)

我只想添加“ $来救援!”:

x = fromIntegral $ sum lst
y = fromIntegral $ length lst

它具有最低优先级,并且它可以避免过多的括号级别。请注意,与(。)不同,它不执行函数组合,它会向右计算参数并将其传递给左侧的函数。类型说明了一切:

($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c