Obecnie pracuję nad projektem z Haskellem i znalazłem trochę problemów. Mam przeczytać i wstawić do listy każdą linię w pliku "dictionary.txt", ale nie mogę tego zrobić. Mam ten kod:Haskell: Wstawianie każdej linii z pliku do listy
main = do
let list = []
loadNums "dictionary.txt" list
loadNums location list = do
inh <- openFile location ReadMode
mainloop inh list
hClose inh
mainloop inh list = do
ineof <- hIsEOF inh
if ineof
then return()
else do
inpStr <- hGetLine inh
inpStr:list
mainloop inh list
to ma dostać każdy wiersz (wiem, że to robi się każdy wiersz, ponieważ zastąpienie „inpStr: lista” z „putStrLn inpStr” działa prawidłowo, wyświetlając wszystkie linie), a następnie włóż go do listy, ale pojawia się następujący błąd:
Couldn't match expected type `IO' against inferred type `[]'
Prawdopodobnie dlatego, że hGetLine nie jest ciągiem znaków, ale IO String, które nie mam pojęcia, jak radzić sobie w celu uzyskania odpowiedni ciąg, który mogę wstawić na mojej liście. Nie mam pojęcia, jak można to rozwiązać, lub co to jest dokładnie, ale jeśli ktoś ma jakiś pomysł, jak poprawnie umieścić każdą linię w pliku, byłbym wdzięczny.
Z góry dziękuję!
Wyjaśniając rzeczy komuś, kto wydaje się nadal uczyć Haskella, unikałbym używania (a nawet pokazywania) bezsensownego stylu. Nie chcę ich przestraszyć ;-) – CesarB
+1 za wymienienie 'readFile'. Pomocne jest wyjście z imperatywnej postawy otwartego pliku/odczytu linii/wykrycia pliku EOF/close, a funkcje takie jak "readFile", "getContents' i" interact "poradzą sobie z bałaganem. – Nefrubyr
Co oznacza "mapM_"? Wiem, że "mapM" mapuje funkcję monady ... ale tę z podkreśleniem? – drozzy