Не удалось сопоставить ожидаемый тип 'IO [String]' с фактическим типом '[String]' - PullRequest
0 голосов
/ 11 мая 2019

У меня есть два фрагмента кода, которые, как я предполагаю, делают то же самое, но они этого не делают. Почему это так?

Этот работает нормально:

fdup :: String -> IO ()
fdup filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        putStr $ unlines $ parse $ lines c
        hClose h

Этот возвращает ошибку Couldn't match expected type ‘IO [String]’ with actual type ‘[String]’:

fdup' :: String -> IO ()
fdup' filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        ls <- lines c
        putStr $ unlines $ parse $ ls
        hClose h

parse :: [String] -> [String]

В чем разница между ними?

1 Ответ

5 голосов
/ 11 мая 2019

Как объяснил Виллем Ван Онсем, вам не нужно <- в этом конкретном месте, потому что lines c - это просто список строк, а не IO вычисление. Если вы хотите дать ему имя, вы можете вместо этого использовать привязку let:

fdup' :: String -> IO ()
fdup' filename = do
        h <- openFile filename ReadMode
        c <- hGetContents h
        let ls = lines c
        putStr $ unlines $ parse $ ls
        hClose h
...