haskell ,仅读取文件内容?
我又来发问题了,各位莫怪。
在 haskell 里,io 操作是叫做 action 的东西,用 do 来实现,比如我可以实现
- buildFrombuildFromFile inputfile f = do
- input <- readFile inputfile
- putStrLn $ f input
复制代码
现在我想做的是,只把文件中的内容读到一个 String 中去,后面的操作先不做,怎么办呢?
就是写这样的一个函数:
- file2String :: String -> String
- file2String fileName = .....
复制代码
不会写了,各位帮忙,谢谢了先。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
嗯,是我用词不准确。
嗯,action 会被执行,由于其不是表达式,因此不会被求值。
看不太懂前后两段之间的逻辑关系。
你是说,“求值”这个词语不能用在“action”身上对么?
action 会被执行,而 expression 才会被求值,expression 求值的结果可能是 action。你可以说“action 只有当执行的时候,才会有效果/效应(effect)”
这是 lazy 思想/风格的体现,当然在 Haskell 中你不需要刻意的去这么做,但在 strict 语言中,特意的推迟昂贵的计算就很有必要了。
不,其实不管你写哪里,都是 lazy 的,
因为 action 只有当执行的时候,才会求值。
Haskell 的 lazy 是语言特性,而不是编程风格/编程思想。
这就是 lazy 的体现了吧,呵呵。谢谢指教。
既然当下不用,那就别读。到用的时候再读。
这样是不行的。
因为读文件必然伴随着 IO,
因此你只能实现
file2String :: String -> IO String
而不能实现
file2String :: String -> String
这也就是 Haskell 特色之一,它从某种程度避免了程序出现 BUG,同时也更有利于编译器做优化,提高运行时性能。
从另一个角度来理解,同样的文件名,可以得到不同的文件内容(因为文件是在磁盘上的嘛),
因此文件名到文件内容的映射不是 pure functional(所谓的 functional 是指,同样的输入必然得到同样的输出)的,必须得有 IO 的介入。
至于 file2String :: String -> IO String 这个函数,实际上是有的,名字叫 readFile:
复制代码
其中的 FilePath 是 String 的一个同义词/别名:
复制代码
[ 本帖最后由 flw 于 2008-10-23 10:42 编辑 ]