Функция является рекурсивной, если она вызывает себя где-нибудь в своем коде.Так что предположим, что не имеется догадки (в коде guessNum или в коде, который он вызывает), нет никакого предположения о догадке, а checkGuess имеет значение.
Хвостовая рекурсия - это когда рекурсивный вызов - это последнее, что делает функция ... но этоHaskell и tail recursion - это термин, в основном предназначенный для строгих языков, где он позволяет оптимизировать рекурсивную функцию, чтобы она не увеличивала стек (текущий вызов может быть прямо заменен рекурсивным, поскольку вам не нужно ничего делатьпосле рекурсивного вызова возвращается).Так как другие говорили, что checkGuess не является хвостовой рекурсией или не будет на строгом языке ... Однако с ленивой семантикой, (a >> b) будет оцениваться как b во многих монадах (включая IO), так как раз aвычисляется (точнее, выполняется действие ввода-вывода), его можно забыть, и единственное, что имеет значение, - это возврат b.
В двух словах, ваша функция checkGuess является рекурсивной, а не хвостовой рекурсивной по большинству формальных определенийно эти определения не адаптированы для нестрогих языков, таких как Haskell, и checkGuess будет определенно выполняться в постоянном пространстве, как если бы он был хвостовым рекурсивным в строгом языке (по крайней мере, с разумными реализациями Haskell, такими как GHC).
Примитивная рекурсия - это понятие, определенное для N ^ k -> N функций, я не думаю, что вопрос имеет смысл для такой функции, как checkGuess, не без некоторой сомнительной адаптации и рассмотрения перевода функции внекоторый более простой язык (эквивалент лямда-исчисления), который означал бысемантика cit IO и т. д. Я бы сказал, что ваша функция ничего не делает со своим параметром Int, что было бы невозможно с примитивной рекурсивной функцией.
Обратите внимание, что ваш код повторяется,может быть, часть, которая действительно должна быть удалена, это:
input<-getLine
let guess = (read input :: Int)
checkGuess guess num