当我在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
谢谢。
答案 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]
。 (一个是另一个的别名。)
True
和False
的类型总是 Bool
。依此类推。
所以只有数字才可能具有多种类型。
[嗯,也有使字符串多态的选项,但是我们现在不必担心...]
如果您想获取混乱的详细信息,可以阅读Haskell语言报告(这是定义Haskell语言的官方规范文档)和GHCi用户手册(其中描述了GHCi的功能)。