这是我编写的一个简单程序。
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会抱怨错误。任何人都可以在内部向我解释在有和没有美元符号(或括号)的情况下会发生什么。
由于
答案 0 :(得分:3)
$
是一个运算符,它将右侧的值传递给左侧的函数。以下是它的实施方式:
f $ x = f x
它非常有用,因为它具有非常低的运算符优先级,因此在您的示例中,首先应用++
运算符,从而生成一个{{1}的字符串1}} function接受并传递给$
。
在您的示例中没有putStrLn
,Haskell将尝试按此顺序评估该行:
$
因此它会尝试打印第一个字符串,然后取(putStrLn "Total lines in the files are ") ++ show (totalLines) ++ " lines"
的结果并将其与其他字符串连接起来,这会导致错误,因为putStrLn
没有返回字符串