我想在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
.
(组合)的优先级低于函数应用,因此
fromIntegral.sum lst
被解释为
fromIntegral . (sum lst)
这是错误的,因为sum lst
不是一个函数。
x = fromIntegral.sum lst
Haskell认为这与以下内容相同:x = fromIntegral.(sum lst)
你原本想写的是:
x = (fromIntegral.sum) lst
(fromIntegral . sum)
可能会引起问题,但不会导致误解。 - ony我只是想添加“美元来解救!”:
x = fromIntegral $ sum lst
y = fromIntegral $ length lst
它具有最低的优先级,它存在是为了避免太多的括号层次。请注意,与(.)不同,它不执行函数组合,而是对右侧的参数进行评估并将其传递给左侧的函数。类型说得清楚:
($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c
x = fromIntegral . sum $ lst
,这更接近于 OP 最初尝试的方式。 - yatima2975$!
。 - Chuck