Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
声明类型会在Haskell中出错,但不声明类型是可以的_Haskell_Types_Numbers - Fatal编程技术网

声明类型会在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