我尝试在 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
我尝试在 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
.
(composition) 的优先级低于函数应用,所以
fromIntegral.sum lst
被解释为
fromIntegral . (sum lst)
这是错误的,因为sum lst
它不是一个函数。
你被 haskell 的运算符优先级规则绊倒了,这令人困惑。
当你写
x = fromIntegral.sum lst
Haskell 认为这与以下内容相同:
x = fromIntegral.(sum lst)
你想写的是:
x = (fromIntegral.sum) lst
我只是想添加“ $ 救援! ”:
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
它的优先级最低,它的存在是为了避免过多的括号级别。请注意,与 (.) 不同,它不进行函数组合,它计算右侧的参数并将其传递给左侧的函数。类型说明了一切:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c