haskell ,仅读取文件内容?

发布于 2022-08-17 06:01:23 字数 509 浏览 18 评论 9

我又来发问题了,各位莫怪。

在 haskell 里,io 操作是叫做 action 的东西,用 do 来实现,比如我可以实现

  1. buildFrombuildFromFile inputfile f = do
  2.   input <- readFile inputfile
  3.   putStrLn $ f input

复制代码

现在我想做的是,只把文件中的内容读到一个 String 中去,后面的操作先不做,怎么办呢?
就是写这样的一个函数:

  1. file2String :: String -> String
  2. file2String fileName = .....

复制代码

不会写了,各位帮忙,谢谢了先。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

弄潮 2022-08-18 06:37:44

原帖由 MMMIX 于 2008-10-23 15:12 发表

嗯,action 会被执行,由于其不是表达式,因此不会被求值。

嗯,是我用词不准确。

挖鼻大婶 2022-08-18 06:37:27

原帖由 flw 于 2008-10-23 15:04 发表

你是说,“求值”这个词语不能用在“action”身上对么?

嗯,action 会被执行,由于其不是表达式,因此不会被求值。

江湖彼岸 2022-08-18 06:37:22

原帖由 MMMIX 于 2008-10-23 14:39 发表

action 会被执行,而 expression 才会被求值,expression 求值的结果可能是 action。你可以说“action 只有当执行的时候,才会有效果/效应(effect)”

看不太懂前后两段之间的逻辑关系。

你是说,“求值”这个词语不能用在“action”身上对么?

来世叙缘 2022-08-18 06:37:12

原帖由 flw 于 2008-10-23 12:12 发表

因为 action 只有当执行的时候,才会求值。

action 会被执行,而 expression 才会被求值,expression 求值的结果可能是 action。你可以说“action 只有当执行的时候,才会有效果/效应(effect)”

叹梦 2022-08-18 06:36:40

原帖由 drunkedcat 于 2008-10-23 11:53 发表

这就是 lazy 的体现了吧,

这是 lazy 思想/风格的体现,当然在 Haskell 中你不需要刻意的去这么做,但在 strict 语言中,特意的推迟昂贵的计算就很有必要了。

趴在窗边数星星i 2022-08-18 06:25:19

原帖由 drunkedcat 于 2008-10-23 11:53 发表

这就是 lazy 的体现了吧,呵呵。谢谢指教。

不,其实不管你写哪里,都是 lazy 的,
因为 action 只有当执行的时候,才会求值。

Haskell 的 lazy 是语言特性,而不是编程风格/编程思想。

秋凉 2022-08-18 06:24:02

原帖由 MMMIX 于 2008-10-23 11:19 发表

既然当下不用,那就别读。到用的时候再读。

这就是 lazy 的体现了吧,呵呵。谢谢指教。

梦与时光遇 2022-08-18 03:47:42

原帖由 drunkedcat 于 2008-10-23 10:16 发表
现在我想做的是,只把文件中的内容读到一个 String 中去,后面的操作先不做,怎么办呢?

既然当下不用,那就别读。到用的时候再读。

誰ツ都不明白 2022-08-17 12:54:25

这样是不行的。
因为读文件必然伴随着 IO,
因此你只能实现

file2String :: String -> IO String

而不能实现

file2String :: String -> String

这也就是 Haskell 特色之一,它从某种程度避免了程序出现 BUG,同时也更有利于编译器做优化,提高运行时性能。

从另一个角度来理解,同样的文件名,可以得到不同的文件内容(因为文件是在磁盘上的嘛),
因此文件名到文件内容的映射不是 pure functional(所谓的 functional 是指,同样的输入必然得到同样的输出)的,必须得有 IO 的介入。

至于 file2String :: String -> IO String 这个函数,实际上是有的,名字叫 readFile:

  1. These functions are also exported by the Prelude.
  2. readFile :: FilePath -> IO String
  3. The readFile function reads a file and returns the contents of the file as a string. The file is read lazily, on demand, as with getContents.
  4. .........

复制代码
其中的 FilePath 是 String 的一个同义词/别名:

  1. type FilePath = String
  2. File and directory names are values of type String, whose precise meaning is operating system dependent. Files can be opened, yielding a handle which can then be used to operate on the contents of that file.

复制代码
[ 本帖最后由 flw 于 2008-10-23 10:42 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文