写入max函数时输入错误

use*_*428 4 haskell

max' :: Int -> Int -> Int
max' a b = if a >= b then a else b 
Run Code Online (Sandbox Code Playgroud)

你看到函数是正确的,但如果我写

let a = 3,
let b = 3
Run Code Online (Sandbox Code Playgroud)

如果我写的话

ghci> a == b => True
Run Code Online (Sandbox Code Playgroud)

所以它比较了它们为什么它在我的功能中没有比较

ghci> max' a b 
Run Code Online (Sandbox Code Playgroud)

错误发生的原因?或者写它的正确方法是什么?

对不起,我是初学者,如果我的问题是愚蠢的原谅我并编辑它,如果有需要,谢谢

<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
Run Code Online (Sandbox Code Playgroud)

Mih*_*eac 9

我猜你是在ghci翻译中这样做的.然后,看看(:t显示表达式的类型和表单的行a :: t意味着a类型t):

Prelude> let a = 3
Prelude> :t a
a :: Integer
Run Code Online (Sandbox Code Playgroud)

ghci解释早期的承诺,并给出a类型Integer,虽然它应该给任何数值类型(因此a :: Num t => t).

现在,你的函数接收IntS作为参数,但由于abInteger你所得到的错误消息.

您可以删除限制类型签名,也可以定义abInt秒.我会选择第一个选项,除非有一些要求与Int-only类型签名一起使用.为此,您需要::Int在定义的末尾添加:

Prelude> let b = 42 :: Int
Prelude> :t b
b :: Int
Run Code Online (Sandbox Code Playgroud)

如果要删除签名,请将函数重新编码为只有一行:

max' a b = if a >= b then a else b 
Run Code Online (Sandbox Code Playgroud)

现在,如果你要检查它的类型:

Prelude> :t max'
max' :: Ord a => a -> a -> a
Run Code Online (Sandbox Code Playgroud)

这意味着您有一个通用功能,适用于任何可订购的类型.

另一种方法是开始ghci使用扩展名:ghci -XNoMonomorphismRestriction.在这种情况下:

Prelude> let a = 3
Prelude> :t a
a :: Num a => a
Run Code Online (Sandbox Code Playgroud)

这将直接适用于您的功能.

ghci没有这个扩展的原因IntegerMonomorphism限制