替换此函数中的括号:
isInteger x = x == fromInteger (round x)
Run Code Online (Sandbox Code Playgroud)
与美元符号运算符:
isInteger x = x == fromInteger $ round x
Run Code Online (Sandbox Code Playgroud)
引发错误.
使用$运算符有什么限制?
$具有极低的优先级,低于==,低于一切.您的尝试被解析为
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用(==)和g用fromInteger . 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)