我希望以下代码将“15”转换为整数并打印结果,但会引发错误。
main = print $ read "15" :: Integer
Couldn't match expected type `Integer' with actual type `IO ()'
但只使用main = print (read "15" :: Integer)
运行正常。我的印象是$有效地围绕括号中的其余部分。 为什么在这种情况下$不工作?
答案 0 :(得分:12)
$
不是将(
置于当前位置并且)
位于该行末尾的语法糖。
所以print $ read "15" :: Integer
被解释为(print (read "15")) :: Integer
。之所以会发生这种情况是因为$ :: (a -> b) -> a -> b
(功能组合中缀运算符)将两个函数print
和read "15"
和«应用»它们相互依赖。 :: Integer
似乎不是此处的函数,它更像是关键字,因此$
无法按预期方式运行。