Использование объявления типа «Может быть» в Haskell [вопрос новичка]

Я начал экспериментировать с 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 (Ничего) он терпит неудачу («Переменная неоднозначного типа« a0 »в ограничении: (Показать a0) возникает из-за использования« qqq »»)
  • Когда я хочу добавить подпись типа в случае неудачи:
    • qqq :: Maybe x => x -> IO () -> Конструктор типа «Может быть», используемый как класс -> Но не так ли?
    • qqq :: (Может быть, x) -> IO (). Теперь сама подпись выглядит удачной. Но main = qqq (Just 43) начинает давать сбой с той загадочной (Show a0) ошибкой, как в случае main = qqq (Nothing) .

Вопросы :

  1. Почему вызов qqq с помощью Ничто так не отличается от вызова с помощью Just 43 ?
  2. Что такое (Покажите a0) ? Это упоминается только в сообщениях об ошибках. Любые попытки использовать это приводят к чему-то вроде «Показать не в области видимости».
  3. Какая для этого правильная сигнатура типа? Как сделать так, чтобы подпись печатного типа Haskell выводилась? Ожидается что-то вроде:
f 0 = 2
f x = (f (x-1)) + 3

main = print get_type_as_string(f)
-- prints "Number -> Number"
6
задан Vi. 16 July 2011 в 10:06
поделиться