如何确定Haskell中文字的类型?

时间:2018-10-12 03:02:14

标签: haskell types literals

当我在GHCi中测试文字类型时,我发现

Prelude> :t 1
1 :: Num p => p

Prelude> :t 'c'    
'c' :: Char

Prelude> :t "string"    
"string" :: [Char]

Prelude> :t 1.0
1.0 :: Fractional p => p

问题是Haskell如何确定此类文字的类型?我在哪里可以找到有关的信息?

此外,是否有任何方法可以更改GHC解释文字类型的方式?

例如:

 -- do something

 :t 1
 1 :: Int      -- interprets 1 as Int rather then Num p => p

 :t 1.0
 1.0 :: Double -- interprets 1.0 as Double rather then Fractional p => p 

谢谢。

2 个答案:

答案 0 :(得分:5)

您可以要求ghci默认类型变量:

$ ghci
λ> let x = 3
λ> :type x
x :: Num p => p
λ> :type +d x
x :: Integer
λ> :type +d 1
1 :: Integer
λ> :type +d 1.0
1.0 :: Double

:type +d将使ghci选择类型变量的默认类型。另外,这是Haskell的默认默认规则:

default Num Integer
default Real Integer
default Enum Integer
default Integral Integer
default Fractional Double
default RealFrac Double
default Floating Double
default RealFloat Double

您可以了解更多about it here

答案 1 :(得分:5)

如果您输入1,则它具有任何可能的数字类型。这就是Num p => p的实际含义。

如果您在表达式中使用1,GHCi将根据您要调用的函数来尝试找出要使用的正确数字类型,然后自动赋予1类型。

如果GHCi无法猜测正确的类型(因为上下文不足或因为可以容纳几种类型),则默认Integer。 (对于1.0,它将默认为Double。对于其他类型约束,如果可能,它将尝试默认为()。)

这类似于编译后的代码的工作方式。如果您在源代码中写了一个数字,GHC(编译器)将尝试自动检测正确的类型。区别在于,如果编译器无法弄清楚,不会“猜测”或“默认”,它只会给您一个编译时间错误并要求您指定您的意思。使编译后的代码按您期望的方式工作是合乎需要的,但是以交互方式进行尝试非常繁琐,这就是GHCi具有默认值的原因。

单个字符的类型始终为 Char

字符串的类型总是 String[Char]。 (一个是另一个的别名。)

TrueFalse的类型总是 Bool。依此类推。

所以只有数字才可能具有多种类型。

[嗯,也有使字符串多态的选项,但是我们现在不必担心...]

如果您想获取混乱的详细信息,可以阅读Haskell语言报告(这是定义Haskell语言的官方规范文档)和GHCi用户手册(其中描述了GHCi的功能)。