我是Haskell的新手,我正在尝试理解这些基本的代码行。我有一个非常简单的主要模块:
main = do
words <- readFile "test.txt"
putStrLn $ reverseCharacters words
其中reverseCharacters
在我拥有的另一个模块中定义:
reverseCharacters :: String -> String
reverseCharacters x = reverse x
我无法理解的是$
需要在那里的原因。我已经读过以前的帖子并查了一下,我仍然难以理解这一点。任何帮助将不胜感激。
答案 0 :(得分:10)
$
是一个运算符,就像+
一样。它的作用是将它的第一个参数(左边的表达式)作为一个函数处理,并将它应用到它的第二个参数(右边的表达式)。
因此,在这种情况下,putStrLn $ reverseCharacters words
相当于putStrLn (reverseCharacters words)
。它需要存在,因为函数应用程序是左关联的,因此不使用$
或括号putStrLn reverseCharacters words
等同于以这种方式括号(putStrLn reverseCharacters) words
,这不起作用(我们可以'将putStrLn
应用于reverseCharacters
[String -> String
类型的某些内容],即使我们可以,我们也无法将putStrLn
的结果应用于words
[某事物]类型String
])。
$
运算符只是明确“分组”单词而不是使用括号的另一种方式;因为它是一个中缀运算符,它强制表达式中的“分裂”(因为它是一个非常低的优先级中缀运算符,即使左侧或右侧的东西使用其他中缀运算符,它仍然有效。)