Главное меню
Мы солидарны с Украиной. Узнайте здесь, как можно поддержать Украину.

Haskell: I

Автор arseniiv, марта 2, 2012, 23:12

0 Пользователи и 1 гость просматривают эту тему.

arseniiv

Я решил, что ещё неизвестно, что получится, и потому, дабы не говорить гоп, пока не перепрыгну, сначала перепрыгнуть, а уж потом думать о вовлечении в [tex]$\TeX$[/tex].

α: На основании чего будем
Предлагаю не скупиться на лишних несколько мегабайт и ставить компилятор GHC (+ его REPL-версию GHCi) с кипой разных модулей и некоторым ещё заместо интерпретатора с немного меньшей кипой. Там есть кое-что полезное. Собственно, хотя ссылка и была уже (притом не от меня) http://hackage.haskell.org/platform.
Из-за компиляторности текст стандартных модулей вы сможете посмотреть только на сайте в разделе документации, а не открывая какие попало из установленных файлов. :(

! Внутренне уникод поддерживается, но ввод-вывод его в REPL не гарантирован. О том, как вводить-выводить файлы в UTF-8, я скажу, когда придёт время и когда я найду, как это называется. Стандартный ввод-вывод, насколько я знаю, побайтовый без излишеств, что не мешает его украсить без хлопот тем, чем надо. Впрочем, об этом, действительно, позже — сейчас это только предупреждение не ждать его от REPL.

β: 2+2
Итак; запустивши GHCi, мы увидим после нескольких сообщений о, надеюсь, удачной загрузке самого основного prompt вида Prelude>. Он озанчает, что сейчас загружен стандартный модуль Prelude с основными определениями (которые, как правило, никому не мешают; выгрузить его не получится; а код его здесь). Если нам нужны будут ещё, можно будет подгрузить их в REPL, введя

:load Имя1 Имя2 ... или просто :l Те же

Введём пока кое-что бесполезное:

> 2 + 2 * 3
8


Ладно хоть приоритет операций привычный.

γ: Типы
У каждого выражения есть строго определённый тип (переменных-то нет, и потому нечему его менять даже при желании). К сожалению, это не даёт составлять списки вида [1, 'a', False], как можно в Лиспе. Встроенные «простые» типы —
Int — целые фиксированного размера,
Integer — целые произвольной длины,
Char — символы,
BoolTrue и False,
Float, Double — float, double,
Rational — дроби с числителем и знаменателем из Integer,
String — строки.
(Это не все. Хотя насчёт встроенности Bool, Rational, String я вас надул. Они определены в Prelude, но об этом позже.)

Чтобы узнать тип любого выражения, введите перед ним :type или ж просто :t.

> :t 'a'
'a' :: Char
> :t False
False :: Bool
> :t 2


Я привёл два целочисленных типа. Какой из них будет выбран по умолчанию, когда мы ничем не ограничивали значение?

2 :: Num a => a

Такое описание типа можно разделить на две части: слева от => и справа. Справа — тип, а слева условия, которым он должен удовлетворять. В данном случае, это читается как «да любой тип, главное чтобы числом был». Целочисленная константа может быть приведена и к дробному или рациональному типу, что логично. То же мы видим и с

> :t 0.3
0.3 :: Fractional a => a


Узнаем, какого типа автор:

> :t "arseniiv"
"arseniiv" :: [Char]


Это означает, что я список символов. Мило! :o Действительно, String лишь синоним для [Char], а синтаксис с кавычками только сахар, хоть и подающийся на выход:

> ['a', 'b']
"ab"


Не думайте только чего про меня: весь синтаксис объясню! Хотя тут вроде понятно.

Наконец, просто проверим, работают ли дроби:

> 2 % 3 + 1 % 7
<interactive>:1:3: Not in scope: `%'
<interactive>:1:11: Not in scope: `%'


Ой. А дело в том, что хотя стандартный модуль Ratio и подключён уже, его надо явно импортировать. В Hugs, к слову, он сразу не подключен, но загружается как я указал выше (с :load).

> import Ratio

Теперь в приглашении у нас и Prelude, и этот. В исходниках нужные модули подключаются точно так же.

> 2 % 3 + 1 % 7
17 % 21
> :t 17 % 21
17 % 21 :: Integral a => Ratio a


Так же как и список, о котором я расскажу далее, зависит от какого-то типа, из которого берутся его элементы, так и рациональное число может быть основано на каком-то из целочисленных типов, что и написано. Но мы ещё можем увидеть что-то более конкретное:

> :t 17 % (21 :: Integer)
17 % (21 :: Integer) :: Ratio Integer


У приведённого выше выражения тип уже огнраничен только одним. Упомянутый выше Rational и есть Ratio Integer. А для Ratio Int синонима не сделали.

Странно, но с прелестями функция я пока вас так и не познакомил. Магия... До скорого!

P. S. Прошу не читать более ничего. Всё будет постепенно. ;-) То бишь, доверьтесь мне.