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章。