如何在Haskell中获取字符的ASCII值?

33
如何在Haskell中获取字符的ASCII值?我尝试使用GHCi中的ord函数,根据我在这里读到的信息,但是出现了以下错误信息:

Not in scope: `ord'

例如:
GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Loading package ffi-1.0 ... linking ... done.
Prelude> ord 'a'

<interactive>:1:0: Not in scope: `ord'
Prelude>

我做错了什么?


4
在GHCi中输入:module +Data.Char,或在你的源代码文件中使用import Data.Char导入该模块。 - Travis Brown
1
@Travis Brown:你也可以在ghci中执行import Data.Char - newacct
@newacct:很酷 - 我不知道那个。但是qualifiedc似乎不起作用。 - Travis Brown
@TravisBrown qualified 工作正常! - is7s
2个回答

40

正如Travis Brown在评论中所指出的,您需要从模块Data.Char导入函数ord

import Data.Char (ord)

main = print (ord 'a')

默认情况下只加载了Prelude模块,所有其他模块都必须显式地导入。


这只是ghci的事情吗?还是我在编写.h​​s文件时也必须导入这些类型的模块? - Chris
4
仅有在Prelude中定义的内容会默认被导入,对于其他模块,你需要指定额外的导入。 - sth

19
你也可以使用fromEnum。(定义在Enum类中,来自预加载。)
Prelude> :i Char
data Char = GHC.Types.C# GHC.Prim.Char#     -- Defined in `GHC.Types'
instance Enum Char -- Defined in `GHC.Enum'
instance Eq Char -- Defined in `GHC.Classes'
...

所以你可以使用 fromEnumtoEnum,它们将ASCII码作为Int值。

Prelude> fromEnum 'A'
65
Prelude> fromEnum 'a'
97
Prelude> toEnum 9 :: Char
'\t'
Prelude> toEnum 100 :: Char
'd'

2
有没有不使用这个的理由? - yyny
1
我更喜欢使用fromEnum/toEnum函数而不是'ord'函数。它们都是Prelude的一部分。 - Jon Watte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接