Подтвердить что ты не робот

Как использовать библиотечную функцию 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 являются стандартными функциями для преобразования символов и целых чисел, но кажется очевидным, что мне нужно "импортировать" их или что-то в этом роде. Как это делается?

4b9b3361

Ответ 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, работает, но я ненавижу этот метод)