Как использовать putStrLn для значения «Может быть» в тесте стека Haskell?

avatar
impast
7 ноября 2020 в 15:33
109
1
3

Я использую стек Haskell для создания программы. Моя программа строится нормально, но я хотел бы написать тестовый файл, чтобы запустить stack test в моей существующей программе. Моя проблема в том, что моя функция для тестирования возвращает тип Maybe, который не может быть выведен с использованием синтаксиса putStrLn f. Я пытаюсь написать в своем тестовом файле функцию, которая принимает значение «Может быть» и возвращает «Ничего», если ей было задано «Ничего», или строку, содержащую , если ей было задано «Просто а.

».

Вот мой код:

printMaybe :: Show a => Maybe a -> String
printMaybe Nothing = "Nothing"
printMaybe (Just a) = show a

и main содержит строку putStrLn $ printMaybe (Nothing)

Мое сообщение об ошибке:

test\Spec.hs:12:16: ошибка: * Переменная неоднозначного типа a0' arising from a use of printMaybe' предотвращает ограничение (Show a0)' from being solved. Probable fix: use a type annotation to specify what a0', которое должно быть. Эти потенциальные экземпляры существуют: Порядок показа экземпляров -- определено в GHC.Show' instance Show Integer -- Defined in GHC.Show' instance Show a => Show (Maybe a) -- определено в GHC.Show' ...plus 22 others ...plus 27 instances involving out-of-scope types (use -fprint-potential-instances to see them all) * In the second argument of ($)', а именно `printMaybe (Nothing)' В строке блока «сделать»: putStrLn $ printMaybe (ничего) В выражении: do putStrLn ("====== Запуск тестов ======") putStrLn $ printMaybe (ничего) | 12 | putStrLn $ printMaybe (ничего) | ^^^^^^^^^^^^^^^^^^^^

Будем очень признательны за любую помощь :)

Источник
Willem Van Onsem
7 ноября 2020 в 15:35
0

Как говорит ошибка, проблема не с вашим printMaybe, а с printMaybe Nothing в вашем блоке do, так как тогда непонятно, что такое тип a.

Ответы (1)

avatar
Willem Van Onsem
7 ноября 2020 в 15:37
1

Как говорит ошибка, проблема не с вашим printMaybe, а с printMaybe Nothing в вашем блоке do, так как тогда неясно, что такое тип a.

Таким образом, у вас, вероятно, есть что-то вроде: K

main = do
    putStrLn "====== Tests Start ======"
    putStrLn (printMaybe Nothing)

Но непонятно, что такое a типа Maybe a для Nothing. Вы можете дать подсказку компилятору с помощью:

main = do
    putStrLn "====== Tests Start ======"
    putStrLn (printMaybe (Nothing :: Maybe Int))