我正在学习“学习一些haskell”,我写了以下应用程序:
import System.IO
main = do
filename <- getLine
handle <- openFile filename ReadMode
content <- hGetContents handle
putStr . unlines . (map isLong) . lines $ content
hClose handle
isLong :: String -> String
isLong x = if length x > 10 then x ++ " long enough" else x ++ " could be better!"但是当我删除行和内容之间的"$“时,编译就失败了。
你能帮我理解一下为什么这是错误的吗?
我想用点组成语句,然后得到一个函数(String -> IO ())并将其应用于"content“,但是为什么这里需要"$”呢?
谢谢!
发布于 2014-11-01 10:37:41
操作员(.)有(b -> c) -> (a -> b) -> a -> c型..。它的前两个输入必须是函数。
然而,lines content是[String]类型的,而不是函数,因此f . lines content将失败。编译器将其视为
f . (lines content)通过添加($),您更改了优先级,它就变成了
f . lines $ content = (f . lines) $ content这是可行的,因为f和lines都是函数。
发布于 2014-11-01 10:36:58
haskell中的美元符号用于在值上应用函数。
它的背后是,您不需要复杂的括号的术语。
https://stackoverflow.com/questions/26688346
复制相似问题