声明类型会在Haskell中出错,但不能声明它们是正常的

时间:2016-04-01 23:09:56

标签: haskell types numbers

当我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不会抛出错误?

2 个答案:

答案 0 :(得分:4)

这是以下三件事的令人困惑的互动:

  • Haskell中的数字文字是多态的:

    Prelude> :type 3
    3 :: Num a => a
    Prelude> :type 2.3
    2.3 :: Fractional a => a
    
  • Monomorphism restriction禁止您的xy具有多态性。

  • Defaulting mechanism使得它不会给你一个“模糊类型”错误编译器,而是尽力给你的xy一个有效的具体类型。在您的ghci会话中,不同的类型有效,但在您的主程序中Integer不起作用,因此它为两者选择Double

答案 1 :(得分:2)

GHCi对GHCi中直接定义的绑定中的数字类型有特殊的默认规则。

您应该:load模块,然后向GHCi询问导出绑定的类型:

> :load Foo.hs
> :type x
> :type y