我如何使用Haskell库函数?

时间:2010-11-22 19:40:07

标签: haskell

我是一名Haskell新手,试图完成Caesar密码练习。

.hs文件中,我定义了以下函数:

let2int :: Char -> Int
let2int c = ord c - ord 'a'

然后我尝试通过键入:l caeser.hs将其加载到GHCi中,并收到以下错误消息:

[1 of 1] Compiling Main             ( caeser.hs, interpreted )
caeser.hs:2:12: Not in scope: `ord'
caeser.hs:2:20: Not in scope: `ord'

从我使用的书中,我的印象是ordchr是用于在字符和整数之间进行转换的标准函数,但似乎很明显我需要“导入”它们或其他东西。这是怎么做到的?

3 个答案:

答案 0 :(得分:20)

它们是标准功能,但您需要先从正确的模块导入它们。添加

import Data.Char

到ceaser.hs,它应该可以工作。

有关编译器附带的完整库集,请参阅http://www.haskell.org/ghc/docs/latest/html/libraries/index.html

答案 1 :(得分:9)

在“Haskell 2010”中,ord位于Data.Char

因此,您需要import Data.Charimport Data.Char (ord)

在“Haskell 98”中,ord可以在模块Char中找到。

查找功能及其模块的一个很棒的工具是

http://www.haskell.org/hoogle/

答案 2 :(得分:4)

如果您使用hoogle搜索ord,您会看到该功能存在于Data.Char模块中。所以只需导入这个模块:

import Data.Char

学习使用hoogle。提出的许多SO Haskell问题都是人们不了解Hoogle的结果......有时候他们也不一定要了解Google(不要劝阻你不要问,但要使用hoogle)。

将来,对于可能与现有功能名称冲突的大型库,您可以将导入限制为您关注的功能:

import Data.Char (ord)

或导入qualified

import qualified Data.Char as C
...
func x y = C.ord x - C.ord y

(第三种方法,使用hiding,但我讨厌该方法)