首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >haskell评估$ sign

haskell评估$ sign
EN

Stack Overflow用户
提问于 2014-11-01 10:31:10
回答 2查看 72关注 0票数 1

我正在学习“学习一些haskell”,我写了以下应用程序:

代码语言:javascript
复制
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“,但是为什么这里需要"$”呢?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-01 10:37:41

操作员(.)有(b -> c) -> (a -> b) -> a -> c型..。它的前两个输入必须是函数。

然而,lines content[String]类型的,而不是函数,因此f . lines content将失败。编译器将其视为

代码语言:javascript
复制
f . (lines content)

通过添加($),您更改了优先级,它就变成了

代码语言:javascript
复制
f . lines $ content = (f . lines) $ content

这是可行的,因为flines都是函数。

票数 8
EN

Stack Overflow用户

发布于 2014-11-01 10:36:58

haskell中的美元符号用于在值上应用函数。

它的背后是,您不需要复杂的括号的术语。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26688346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档