由于Haskell运算符优先级,写/这是好/正确的方法?

时间:2014-12-28 01:22:13

标签: haskell operators

此代码有效:

40 * sum [1..10]

此代码不会:

40 * sum $ map id [1..10]

我现在理解它是因为由于运算符优先级而不是我认为它应该是(40 * sum) (map id [1..10]),因此它被归为(40 *) (sum (map id [1..10]))

除了使用括号外,是否有正确的方法在Haskell中编写?

2 个答案:

答案 0 :(得分:5)

我知道没有办法在不使用括号的情况下正确编写这个表达式,但我更愿意看到更像下列之一的内容

(40 *) $ sum $ map id [1..10]

40 * (sum $ map id [1..10])

(*) 40 $ sum $ map id [1..10]

(40 *) . sum . map id $ [1..10]

而不是

(40 *) (sum (map id [1..10]))

如果您将(*)别名为函数而不是运算符,则可以删除此特定表达式中的parens:

mult :: Num a => a -> a -> a
mult = (*)

expr :: Int
expr = mult 40 $ sum $ map id [1..10]

但是,我不会过分担心有一些括号,在这种情况下,拥有它们并不是一件大事。引入新名称只是为了规避少量正常语法只会使您的代码更难以阅读和理解。

答案 1 :(得分:0)

更接近原始表达式40 * sum $ map id [1..10]的答案是考虑(*)只是函数的名称,因此括号只是名称的一部分,而不是分组符号,并将表达式重写为:

(*) 40 . sum $ map id [1..10]

这种方式也避免了优先级问题,这只会影响二进制函数(运算符)的中缀形式。

功能性编程鼓励使用组合与应用程序,因此更多"适当的"正如你所要求的那样,这将是一个微小的变化:

(*) 40 . sum . map id $ [1..10]