Как исправить '' не удалось сопоставить ожидаемый тип IO a0 с int '' в Haskell? - PullRequest
0 голосов
/ 08 февраля 2019

Линия checkArgCount args доставляет мне неприятности.args это тип [String] не так ли?Я запутался, почему это дает мне ошибку.

import System.IO
import Data.List
import System.Environment --for command line args

--Checks if number of arguments provided is 2
checkArgCount ::[String] -> Int
checkArgCount a = if (length a) == 2 then 2 else error "No arguments" 

main :: IO()
main = do
     args <- getArgs
     checkArgCount args

Ответы [ 3 ]

0 голосов
/ 08 февраля 2019

Да, args :: [String], но checkArgCount args должен иметь тип IO (), являясь последней строкой в ​​блоке do с общим типом IO ().

Таким образом, речь идет о типе вывода, а не о типе ввода этой функции.

Изменение 2 на print 2 в последующем if должно исправить это (и, конечно,изменение сигнатуры типа checkArgCount для соответствия изменению).

0 голосов
/ 08 февраля 2019
args <- getArgs
     if (length args) /= 2
        then return()
        else do -- ..continue coding

Оказалось гораздо более простым решением

0 голосов
/ 08 февраля 2019

main объявлен с типом IO () (это правильно).Последнее выражение в любой функции - это возвращаемое значение.Этот конкретный код возвращает результат checkArgCount args, то есть Int.

Значение Int не является значением IO (), поэтому проверка типа не выполняется.

Вам следует либо изменить тип checkArgCount, чтобы он возвращал () или IO (), либо добавить дополнительный код к main, который использует Int, возвращаемый checkArgCount.

...