Как использовать библиотечную функцию Haskell?
Я новичок Haskell, пытаясь выполнить упражнение шифрования Цезаря.
В файле .hs
я определил следующую функцию:
let2int :: Char -> Int
let2int c = ord c - ord 'a'
Затем я пытаюсь загрузить это в GHCi, набрав :l caeser.hs
, и я получаю следующее сообщение об ошибке:
[1 of 1] Compiling Main ( caeser.hs, interpreted )
caeser.hs:2:12: Not in scope: `ord'
caeser.hs:2:20: Not in scope: `ord'
Из книги, которую я использовал, у меня создалось впечатление, что ord
и chr
являются стандартными функциями для преобразования символов и целых чисел, но кажется очевидным, что мне нужно "импортировать" их или что-то в этом роде. Как это делается?
Ответы
Ответ 1
Это стандартные функции, но сначала нужно импортировать их из правильного модуля. Добавить
import Data.Char
to ceaser.hs, и он должен работать.
См. также http://www.haskell.org/ghc/docs/latest/html/libraries/index.html для полного набора библиотек, которые поставляются вместе с компилятором.
Ответ 2
В "Haskell 2010", ord
живет в Data.Char
Итак, вы захотите import Data.Char
или import Data.Char (ord)
В "Haskell 98", ord
можно найти в модуле Char
.
Отличным инструментом для поиска функций и их модулей является
http://www.haskell.org/hoogle/
Ответ 3
Если вы используете 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
, работает, но я ненавижу этот метод)