写入max函数时输入错误

时间:2013-11-17 21:56:50

标签: haskell

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 个答案:

答案 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作为参数,但由于abInteger,您会收到该错误消息。

您可以删除限制型签名,也可以将ab定义为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