替换此函数中的括号:
isInteger x = x == fromInteger (round x)
使用美元符号运算符:
isInteger x = x == fromInteger $ round x
引发错误。
使用$运算符有什么限制?
答案 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"
。这显然没有意义。