Ошибка при написании максимальной функции

max' :: Int -> Int -> Int
max' a b = if a >= b then a else b 

Вы видите, что функция верна, но если я напишу

let a = 3,
let b = 3

а также если я напишу

ghci> a == b => True

поэтому он сравнивает их, то почему не сравнивается в моей функции

ghci> max' a b 

почему происходит ошибка? или как правильно это написать?

Извините, я новичок, если мой вопрос глупый, простите меня за это и отредактируйте его, если в этом есть необходимость. Спасибо

<interactive>:19:6:
    Couldn't match expected type `Int' with actual type `Integer'
    In the first argument of max', namely `a'
    In the expression: max' a b
    In an equation for `it': it = max' a b

<interactive>:19:8:
    Couldn't match expected type `Int' with actual type `Integer'
    In the second argument of max', namely `b'
    In the expression: max' a b
    In an equation for `it': it = max' a b

2 ответа

Решение

Я полагаю, вы делаете это в ghci переводчик. Затем посмотрите на (:t отображает тип выражения и строку вида a :: t средства a имеет тип t):

Prelude> let a = 3
Prelude> :t a
a :: Integer

ghci переводчик совершает рано и дает a тип Integer хотя он должен давать любой числовой тип (таким образом, a :: Num t => t).

Теперь ваша функция получает Intв качестве аргументов, но так как a а также b являются IntegerВы получите это сообщение об ошибке.

Вы можете удалить сигнатуру ограничительного типа или определить a а также b быть Ints. Я бы выбрал первый вариант, если нет необходимости Intтолько подпись типа. Для этого нужно добавить ::Int в конце определения:

Prelude> let b = 42 :: Int
Prelude> :t b
b :: Int

Если вы хотите удалить подпись, перекодируйте вашу функцию так, чтобы она содержала только одну строку:

max' a b = if a >= b then a else b 

Теперь, если вы хотите проверить его тип:

Prelude> :t max'
max' :: Ord a => a -> a -> a

Это означает, что у вас есть универсальная функция, которая работает для любого типа, который можно заказать.

Альтернатива - начать ghci используя расширение: ghci -XNoMonomorphismRestriction, В этом случае:

Prelude> let a = 3
Prelude> :t a
a :: Num a => a

который будет работать непосредственно на вашу функцию.

Причина по которой ghci без этого расширения обязуется Integer такое ограничение мономорфизма

Когда вы используете let a = 3, тип a будет Integerне Int, Вы можете проверить это с помощью :t a в ghci, Ты можешь использовать let a = 3 :: Int чтобы убедиться, что вы получите правильный тип:

ghci> let a = 3:: Int
ghci> let b = 3:: Int
ghci> max 'ab
Другие вопросы по тегам