在putStrLn函数中使用美元符号

时间:2017-03-10 07:44:51

标签: haskell

这是我编写的一个简单程序。

import System.Environment
import System.IO

main = do
  (fileName1:_) <- getArgs
  contents <- readFile fileName1
  let myList = lines contents
      totalLines = length myList
  putStrLn $ "Total lines in the files are " ++ show (totalLines) ++ " lines"

如果我删除最后一行中的美元符号,Haskell会抱怨错误。任何人都可以在内部向我解释在有和没有美元符号(或括号)的情况下会发生什么。

由于

1 个答案:

答案 0 :(得分:3)

$是一个运算符,它将右侧的值传递给左侧的函数。以下是它的实施方式:

f $ x = f x

它非常有用,因为它具有非常低的运算符优先级,因此在您的示例中,首先应用++运算符,从而生成一个{{1}的字符串1}} function接受并传递给$

在您的示例中没有putStrLn,Haskell将尝试按此顺序评估该行:

$

因此它会尝试打印第一个字符串,然后取(putStrLn "Total lines in the files are ") ++ show (totalLines) ++ " lines" 的结果并将其与其他字符串连接起来,这会导致错误,因为putStrLn没有返回字符串