声明类型会在Haskell中出错,但不声明类型是可以的
当我声明类型会在Haskell中出错,但不声明类型是可以的,haskell,types,numbers,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'与实际类型Float'匹配” 我确实理解,当声明f的类型时,我强制要求x和y应该是相同的类型,这就是我得到错误的原因。我不明白的是为什么它在第一种情况下有效 当我在
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'与实际类型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
不抛出错误呢?这是一个由以下三件事情组成的混乱交互:
- Haskell中的数字文字是多态的:
Prelude> :type 3
3 :: Num a => a
Prelude> :type 2.3
2.3 :: Fractional a => a
- 禁止您的
x
和y
多态
- 这样,编译器就不会给你一个“不明确类型”错误,而是尽力给你的
x
和y
一个具体的类型。在您的ghci会话中,不同的类型可以工作,但在主程序中,Integer
不工作,因此它选择了Double
这是一个由以下三件事组成的令人困惑的互动:
- Haskell中的数字文字是多态的:
Prelude> :type 3
3 :: Num a => a
Prelude> :type 2.3
2.3 :: Fractional a => a
- 禁止您的
x
和y
多态
- 这样,编译器就不会给你一个“不明确类型”错误,而是尽力给你的
x
和y
一个具体的类型。在您的ghci会话中,不同的类型可以工作,但在主程序中,Integer
不工作,因此它选择了Double
GHCi对GHCi中直接定义的绑定中的数字类型有特殊的默认规则
您应该加载模块,然后向GHCi询问导出绑定的类型:
> :load Foo.hs
> :type x
> :type y
GHCi对GHCi中直接定义的绑定中的数字类型有特殊的默认规则
您应该加载模块,然后向GHCi询问导出绑定的类型:
> :load Foo.hs
> :type x
> :type y
这听起来像是GHCi的一个相当古老的版本。最近的版本在交互模式下默认关闭了单态限制,这使它们表现得更好。我刚刚使用sudo-apt-get-install-haskell-platform下载了haskell-platform
…它可能很旧了。但是查看的方法是使用--version
。这听起来像是GHCi的一个相当旧的版本。最近的版本在交互模式下默认关闭了单态限制,这使它们表现得更好。我刚刚使用sudo-apt-get-install-haskell-platform下载了haskell-platform
…它可能很旧了。但是查看的方法是使用--version
。