对Haskell中的'$'字符有点困惑

时间:2014-03-01 22:34:40

标签: haskell

我是Haskell的新手,我正在尝试理解这些基本的代码行。我有一个非常简单的主要模块:

main = do
       words <- readFile "test.txt"
       putStrLn $ reverseCharacters words

其中reverseCharacters在我拥有的另一个模块中定义:

reverseCharacters :: String -> String
reverseCharacters x = reverse x

我无法理解的是$需要在那里的原因。我已经读过以前的帖子并查了一下,我仍然难以理解这一点。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:10)

$是一个运算符,就像+一样。它的作用是将它的第一个参数(左边的表达式)作为一个函数处理,并将它应用到它的第二个参数(右边的表达式)。

因此,在这种情况下,putStrLn $ reverseCharacters words相当于putStrLn (reverseCharacters words)。它需要存在,因为函数应用程序是左关联的,因此不使用$或括号putStrLn reverseCharacters words等同于以这种方式括号(putStrLn reverseCharacters) words,这不起作用(我们可以'将putStrLn应用于reverseCharacters [String -> String类型的某些内容],即使我们可以,我们也无法将putStrLn的结果应用于words [某事物]类型String])。

$运算符只是明确“分组”单词而不是使用括号的另一种方式;因为它是一个中缀运算符,它强制表达式中的“分裂”(因为它是一个非常低的优先级中缀运算符,即使左侧或右侧的东西使用其他中缀运算符,它仍然有效。)