Предполагая, что у меня есть *File
, что я хочу прочитать весь его контент и сохранить каждую строку как отдельный элемент в списке.
Мое интуитивно понятное решение было:
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)
Но, конечно, я получил ошибку, так как нарушил некоторые правила Uniquness:
не может быть предложен атрибут запрашиваемого файлапо общему объекту.
Как избежать этой проблемы уникальности?Я пытался использовать where
для хранения значения одного freadline
, но, видимо, это не работает.
Пожалуйста, примите во внимание тот факт, что я новичок в Clean
и правилах уникальностимне не очень понятно.Большое спасибо!