不允许用美元符号代替括号

时间:2016-05-08 20:32:09

标签: haskell

替换此函数中的括号:

isInteger x = x == fromInteger (round x)

使用美元符号运算符:

isInteger x = x == fromInteger $ round x

引发错误。

使用$运算符有什么限制?

2 个答案:

答案 0 :(得分:6)

$优先级极低,低于==,低于所有。您的尝试被解析为

isInteger x = (x == fromInteger) $ (round x)

也就是说,它尝试将Bool作为函数应用。你可以写

isInteger x = x == (fromInteger $ round x)

但这并没有真正保存任何括号;它只是改变它们。

如果真的想要摆脱括号(或者至少将它们移到一边),你可以利用(-> r)是一个应用函子的事实,简而言之就是f <*> g == \x -> f x (g x)。将f替换为(==),将g替换为fromInteger . round,即可获得

isInteger = (==) <*> fromInteger . round

,因为

x == fromInteger (round x) -> (==) x (fromInteger (round x))
                           -> (==) x ((fromInteger . round) x)
                              ----    ---------------------
                               f   x (          g           x)

答案 1 :(得分:1)

这是您在评论中链接的问题中接受的答案的开头:

  

$运算符用于避免括号。 之后出现的任何事情   它将优先于之前发生的任何事情。

考虑到这一点,isInteger x = x == fromInteger $ round x变为isInteger x = (x == fromInteger) (round x),因此您将x == fromInteger的结果(类型为Bool)并将其应用于round x string = "100 red balloons" strip_digits = string.gsub(/[^a-zA-Z\s]/, '') => " red balloons" 。这显然没有意义。