Тип qqq
:
qqq :: Show a => Maybe a -> IO ()
Это означает, что qqq
принимает один параметр типа Maybe a
и возвращает действие ввода-вывода без значения с ограничением , что a
реализует класс типов Show
.Чтобы узнать, что такое Show
, вы можете использовать :i Show
в ghci.
Show
- это класс типов, который требует, чтобы значение типа могло быть преобразовано в строку.qqq
имеет ограничение, потому что print
хочет распечатать значение (print
имеет тип Show a => a -> IO ()
).Maybe
это не класс типов, а тип данных.Вы можете узнать больше о типах классов здесь .
Вы можете позволить GHC определять сигнатуру типа, либо набрав функцию в файле .hs, затем загрузив файл с помощью ghci (ghci Myfile.hs
)и затем введите :t qqq
для отображения типа.Вы также можете определить функцию в интерактивном сеансе с помощью let qqq n = case n of { Nothing -> print "abc"; Just x -> print "def" >> print x }
(выглядит немного иначе, потому что определение функции должно быть в одной строке в ghci, но смысл тот же).
Когда основные вызовыqqq
с qqq (Just 43)
, ясно, что конкретный тип Maybe a
является числовым типом (по умолчанию ghci - Integer), поэтому qqq
имеет конкретный тип Maybe Integer -> IO ()
.Однако основные вызовы qqq
с qqq Nothing
, a
могут быть любыми (это неоднозначно), и ghci сообщает об ошибке.