Haskell点运算符

Rom*_*man 14 syntax haskell function-composition

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

lst = [1, 3]

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

z = x / y
Run Code Online (Sandbox Code Playgroud)

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

lst = [1, 3]

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

z = x / y
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 17

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

fromIntegral.sum lst
Run Code Online (Sandbox Code Playgroud)

被解释为

fromIntegral . (sum lst)
Run Code Online (Sandbox Code Playgroud)

这是错误的,因为sum lst它不是一个功能.


Dan*_*tin 16

您可能会因为运营商的哈斯克尔优先规则而被绊倒,这令人困惑.

当你写作

x = fromIntegral.sum lst
Run Code Online (Sandbox Code Playgroud)

Haskell认为它与:

x = fromIntegral.(sum lst)
Run Code Online (Sandbox Code Playgroud)

你打算写的是:

x = (fromIntegral.sum) lst
Run Code Online (Sandbox Code Playgroud)

  • 确实如此.但是我认为编写没有空格的运算符有时会导致误解(即它看起来类似于许多以OOP为中心的语言中成员访问的构造).`(fromIntegral.sum)`可能会引起问题,但不会引起误解. (8认同)

sbk*_*sbk 10

我只想添加" $ to the rescue! ":

x = fromIntegral $ sum lst
y = fromIntegral $ length lst
Run Code Online (Sandbox Code Playgroud)

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

($) :: (a -> b) -> a -> b
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)