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)
我猜你是在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作为参数,但由于a和b是Integer你所得到的错误消息.
您可以删除限制类型签名,也可以定义a并b为Int秒.我会选择第一个选项,除非有一些要求与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没有这个扩展的原因Integer是Monomorphism限制
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |