不允许美元符号代替括号

Tra*_*son 0 haskell

替换此函数中的括号:

isInteger x = x == fromInteger (round x)
Run Code Online (Sandbox Code Playgroud)

与美元符号运算符:

isInteger x = x == fromInteger $ round x
Run Code Online (Sandbox Code Playgroud)

引发错误.

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

che*_*ner 6

$具有极低的优先级,低于==,低于一切.您的尝试被解析为

isInteger x = (x == fromInteger) $ (round x)
Run Code Online (Sandbox Code Playgroud)

也就是说,它试图将a Bool作为函数应用.你可以写

isInteger x = x == (fromInteger $ round x)
Run Code Online (Sandbox Code Playgroud)

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


如果你真的想摆脱括号(或者至少,真的把它们移到一边),你可以利用这(-> r)是一个应用函子的事实,简而言之就是这样f <*> g == \x -> f x (g x).更换f(==)gfromInteger . round,你会得到

isInteger = (==) <*> fromInteger . round
Run Code Online (Sandbox Code Playgroud)

因为

x == fromInteger (round x) -> (==) x (fromInteger (round x))
                           -> (==) x ((fromInteger . round) x)
                              ----    ---------------------
                               f   x (          g           x)
Run Code Online (Sandbox Code Playgroud)

  • 虽然我们引用了LYAH,但我还应该提到"[函数]很少用于代码高尔夫以外的应用风格".它聪明,简洁,几乎不可读:) (5认同)