当我runhaskell
以下代码时:
f :: Num a => a -> a -> a
f x y = x*x + y*y
x = 3
y = 2.3
main = print (f x y)
一切都很好。但是当我在x和y赋值之上添加类型声明时:
x :: Int
y :: Float
我收到错误:“无法匹配预期类型Int' with actual type
Float'”。
我确实理解当声明f
的类型时我强调x和y应该是相同的类型,这就是我得到错误的原因。我不明白为什么它适用于第一种情况!
当我在GHCi中运行作业并查询我得到的类型
时Prelude> let x = 3
Prelude> :type x
x :: Integer
Prelude> let y = 2.3
Prelude> :type y
y :: Double
x和y,当未声明类型时,被解释为不同类型的数字!为什么f
不会抛出错误?
答案 0 :(得分:4)
这是以下三件事的令人困惑的互动:
Haskell中的数字文字是多态的:
Prelude> :type 3
3 :: Num a => a
Prelude> :type 2.3
2.3 :: Fractional a => a
Monomorphism restriction禁止您的x
和y
具有多态性。
Defaulting mechanism使得它不会给你一个“模糊类型”错误编译器,而是尽力给你的x
和y
一个有效的具体类型。在您的ghci会话中,不同的类型有效,但在您的主程序中Integer
不起作用,因此它为两者选择Double
。
答案 1 :(得分:2)
GHCi对GHCi中直接定义的绑定中的数字类型有特殊的默认规则。
您应该:load
模块,然后向GHCi询问导出绑定的类型:
> :load Foo.hs
> :type x
> :type y