Ошибка типа рекурсивной функции Haskell с логическим значением

#haskell #recursion

#haskell #рекурсия

Вопрос:

Я новичок в haskell. Не хочу использовать какую-либо библиотечную функцию, изучая язык.

Я пытаюсь написать рекурсивную функцию, чтобы определить, является ли число идеальным квадратом. Но функция выдает ошибку типа. Не знаю, что я делаю не так.

 perfectSq' n y = if (n*n) == y then True else if n == 0 then False else perfectSq' n-1 y

• Couldn't match type ‘t -> Bool’ with ‘Bool’
      Expected type: t -> Bool
        Actual type: t -> t -> Bool
• Relevant bindings include
        perfectSq' :: t -> Bool
 

Ответ №1:

Выражение perfectSq' n-1 y компилируется как (perfectSq' n) - (1 y) — то есть приложение функции связывается сильнее, чем оператор минус.

Вам нужно добавить круглые скобки, чтобы помочь компилятору с правильным порядком операций:

 perfectSq' (n-1) y