如何判断Haskell中文字的类型?
How to determine the type of literal in Haskell?
当我在 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
提前致谢。
您可以要求 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
,它有任何可能的数字类型。这就是 Num p => p
的实际含义。
如果您在表达式中使用 1
,GHCi 将尝试根据您调用的函数找出正确的数字类型,然后自动给出 1
正确的类型。
如果 GHCi 无法猜测正确的类型是什么(因为没有足够的上下文或因为有多种类型适合),它 默认 到 Integer
。 (对于 1.0
,它将默认为 Double
。对于任何其他类型的约束,如果可能,它将尝试默认为 ()
。)
这类似于编译代码的工作方式。如果您在源代码中写入数字,GHC(编译器)将尝试自动检测正确的类型。不同的是,如果编译器无法解决,它不会 "guess"或"default",它只会给你一个编译时错误,并要求你指定你的意思。使编译后的代码按照您的预期工作是可取的,但是交互式地尝试东西是乏味的,这就是 GHCi 具有默认值的原因。
单个字符的类型是always Char
.
字符串的类型是alwaysString
或[Char]
。 (一个是另一个的别名。)
True
和False
的类型是alwaysBool
。等等。
所以只有数字才有多种类型的可能性。
[好吧,还有一个选项可以使字符串多态化,但我们现在不用担心了...]
如果你想要更详细的信息,你可以阅读 Haskell 语言报告(这是定义 Haskell 语言的官方规范文档)和 GHCi 用户手册(描述 GHCi 做什么).
当我在 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
提前致谢。
您可以要求 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
,它有任何可能的数字类型。这就是 Num p => p
的实际含义。
如果您在表达式中使用 1
,GHCi 将尝试根据您调用的函数找出正确的数字类型,然后自动给出 1
正确的类型。
如果 GHCi 无法猜测正确的类型是什么(因为没有足够的上下文或因为有多种类型适合),它 默认 到 Integer
。 (对于 1.0
,它将默认为 Double
。对于任何其他类型的约束,如果可能,它将尝试默认为 ()
。)
这类似于编译代码的工作方式。如果您在源代码中写入数字,GHC(编译器)将尝试自动检测正确的类型。不同的是,如果编译器无法解决,它不会 "guess"或"default",它只会给你一个编译时错误,并要求你指定你的意思。使编译后的代码按照您的预期工作是可取的,但是交互式地尝试东西是乏味的,这就是 GHCi 具有默认值的原因。
单个字符的类型是always Char
.
字符串的类型是alwaysString
或[Char]
。 (一个是另一个的别名。)
True
和False
的类型是alwaysBool
。等等。
所以只有数字才有多种类型的可能性。
[好吧,还有一个选项可以使字符串多态化,但我们现在不用担心了...]
如果你想要更详细的信息,你可以阅读 Haskell 语言报告(这是定义 Haskell 语言的官方规范文档)和 GHCi 用户手册(描述 GHCi 做什么).