нравится:
ал экспериментировать с Haskell и у меня возникла проблема. qqq - это функция, которая должна печатать одну строку, если вызывается с помощью «Ничего», и печатать другие вещи, если вызывается с помощью «Просто чего-то».
Первая попытка, похоже, работает:
qqq Nothing = print "There isn't anything to be printed."
qqq (Just x) = print "There is something to be printed." >> print x
main :: IO ()
main = qqq (Just 43)
Но:
когда я пытаюсь сделатьmain = qqq (Nothing)
он терпит неудачу («Переменная типа неопределенности« a0 »в ограничении: (Показать a0), возникающая в результате использования« qqq »»)Когда я хочу добавить тип подписи, если не удается:qqq :: Maybe x => x -> IO ()
->Type constructor 'Maybe' used as a class
-> Но не так ли?qqq :: (Maybe x) -> IO ()
, Теперь сама подпись выглядит удачной. Ноmain = qqq (Just 43)
начинает терпеть неудачу с этим таинственным(Show a0)
ошибка как вmain = qqq (Nothing)
кейс.Вопросов:
Зачем звонить qqq сNothing
так отличается от звонка сJust 43
?Что такое(Show a0)
? Упоминается только в сообщениях об ошибках. Любые попытки использовать его приводят к чему-то вроде «Показать не в области».Какова правильная сигнатура типа для этого? Как сделать так, чтобы на Хаскеле была напечатана подпись типа печати? Ожидая что-то вроде:f 0 = 2
f x = (f (x-1)) + 3
main = print get_type_as_string(f)
-- prints "Number -> Number"