免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6954 | 回复: 11
打印 上一主题 下一主题

haskell ,仅读取文件内容? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-23 10:16 |只看该作者 |倒序浏览
我又来发问题了,各位莫怪。


在 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 = .....
复制代码


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
2 [报告]
发表于 2008-10-23 10:29 |只看该作者
这样是不行的。
因为读文件必然伴随着 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 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
3 [报告]
发表于 2008-10-23 11:19 |只看该作者
原帖由 drunkedcat 于 2008-10-23 10:16 发表
现在我想做的是,只把文件中的内容读到一个 String 中去,后面的操作先不做,怎么办呢?

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

论坛徽章:
0
4 [报告]
发表于 2008-10-23 11:53 |只看该作者
原帖由 MMMIX 于 2008-10-23 11:19 发表

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


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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2008-10-23 12:12 |只看该作者
原帖由 drunkedcat 于 2008-10-23 11:53 发表

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

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

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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2008-10-23 14:32 |只看该作者
原帖由 drunkedcat 于 2008-10-23 11:53 发表


这就是 lazy 的体现了吧,

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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
7 [报告]
发表于 2008-10-23 14:39 |只看该作者
原帖由 flw 于 2008-10-23 12:12 发表

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2008-10-23 15:04 |只看该作者
原帖由 MMMIX 于 2008-10-23 14:39 发表

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

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

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

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2008-10-23 15:12 |只看该作者
原帖由 flw 于 2008-10-23 15:04 发表

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
10 [报告]
发表于 2008-10-23 15:27 |只看该作者
原帖由 MMMIX 于 2008-10-23 15:12 发表

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

嗯,是我用词不准确。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP