- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我学习 Haskell。它工作正常:
import System.IO
main = do
h <- openFile "text.txt" ReadMode
cnt <- hGetContents h
mapM_ putStrLn $ lines cnt
hClose h
但这不起作用:
import System.IO
main = do
h <- openFile "text.txt" ReadMode
mapM_ putStrLn $ lines (cnt <- hGetContents h)
hClose h
为什么我的第二个变体不起作用?我希望这两种变体是相等的,因为 (cnt <- hGetContents h)
是一个表达式,也返回值。
最佳答案
问题是cnt <- hGetContents h
不是表达式,它是do notation 中的一些特殊语法糖.这意味着它是编写以下普通 Haskell 代码的不同方式:
hGetContents h >>= \ cnt -> {- rest of do block -}
{- rest of the do block -}
之前的部分这里不是一个完整的表达式,因为完成 lambda 的主体需要 do block 的其余部分。
您可以手动对其进行脱糖以获取如下内容:
hGetContents h >>= \ cnt -> mapM_ putStrLn (lines cnt)
或免积分版
hGetContents h >>= mapM_ putStrLn . lines
您可以看出它是一个特殊的表达式,因为它引入了一个新标识符 (cnt
),您可以在表达式本身之外的其余代码中使用该标识符。这不是普通的 Haskell 表达式可以做的事情(至少没有编译时魔法)。
关于haskell - 为什么我不能使用 (cnt <- hGetContents h) 表达式而不是 cnt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27909405/
我有以下代码片段,我将其传递给 withFile : text => operation >=> print) bad file operation = (withFile file ReadMod
我想将 Haskell 添加到我的工具箱中,所以我正在努力通过 Real World Haskell . 在输入和输出一章中,在 the section on hGetContents 中,我遇到了这
我在 Haskell 中有一个程序从套接字获取所有输入并打印它。 main = withSocketsDo $ do sock IO () work
hGetContents返回一个惰性 String 对象,可在纯函数代码中使用该对象从文件句柄中读取。如果在读取此惰性字符串时发生 I/O 异常,则底层文件句柄将静默关闭,并且不会向惰性字符串添加任何
我试图理解haskell IO,但stdin的这个特性最终让我感到困惑: 当我尝试使用诸如 getContents 之类的功能时,例如: let main = do x<-getContents; p
当我尝试将 UTF8 文本文件读取为 Text 时,我尝试使用Data.Text.IO.readFile . 但是,当系统环境的区域设置不是 *.UTF8 时(特别是 c ),它不起作用。 它说hGe
我学习 Haskell。它工作正常: import System.IO main = do h >= \ cnt -> {- rest of do block -} {- rest of the
我在 Mac OSX 10.6.8 的终端中运行以下代码: find . -name \*.html -type f -exec pandoc -o {}.md {} \; 它解析了一些文档,但在很多
我正在使用 Haskell 编写解析器,但是这个错误是我无法逾越的墙。这是我的代码: main = do arguments <- getArgs let fileName = head
我是一名优秀的程序员,十分优秀!