Ошибка при написании максимальной функции
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
быть Int
s. Я бы выбрал первый вариант, если нет необходимости 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