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
答案 0 :(得分:9)
我猜你是在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
。我会选择第一个选项,除非有一些要求与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
的原因是Monomorphism restriction
答案 1 :(得分:2)
当您使用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' a b