Functional programming 清除语言:将文本文件的内容读取到行列表中。是否有可能避免独特性?
假设我有Functional programming 清除语言:将文本文件的内容读取到行列表中。是否有可能避免独特性?,functional-programming,clean-language,uniqueness-typing,Functional Programming,Clean Language,Uniqueness Typing,假设我有*文件,我想读取它的全部内容,并将每一行作为不同的元素存储在列表中 我直观的解决方案是: first (x,y) = x readFile:: *File -> [{#Char}] readFile file | first (fend (file)) = [] | otherwise = [ line : readFile (file)] where line = first(freadline (file)) frea
*文件
,我想读取它的全部内容,并将每一行作为不同的元素存储在列表中
我直观的解决方案是:
first (x,y) = x
readFile:: *File -> [{#Char}]
readFile file
| first (fend (file)) = []
| otherwise = [ line : readFile (file)]
where
line = first(freadline (file))
freadline
和fend
都来自StdFile
模块:
/**
* Reads a line from a textfile, including a newline character, except for the
* last line. `freadline` cannot be used on data files.
*/
freadline :: !*File -> (!*{#Char},!*File)
/**
* @result Whether end-of-file has been reached
*/
fend :: !*File -> (!Bool,!*File)
但我当然犯了错误,因为我违反了一些唯一性规则:
共享对象无法提供文件所需属性
如何避免这种单一性问题?
我曾尝试使用where
来存储一个freadline
的值,但显然不起作用
请考虑我是新的<代码> Cudio,并且我的独特性规则不太清楚。非常感谢
这种基本功能已经包含在库中,例如在System.File中。有关其执行所述操作的readAllLines
函数,请参阅。不,不可能(不应该)规避唯一性键入-它是类型系统的一个功能,旨在确保语言的纯度,同时仍然允许可变更新和I/O操作。请参阅语言报告的第9章了解这一点。这种基本功能已经在库中介绍过,例如在System.File中。有关其执行所述操作的readAllLines
函数,请参阅。不,不可能(不应该)规避唯一性键入-它是类型系统的一个功能,旨在确保语言的纯度,同时仍然允许可变更新和I/O操作。有关此信息,请参见语言报告第9章。