Я решил, что ещё неизвестно, что получится, и потому, дабы не говорить гоп, пока не перепрыгну, сначала перепрыгнуть, а уж потом думать о вовлечении в
![$\TeX$ [tex]$\TeX$[/tex]](https://latex.codecogs.com/png.latex?$\TeX$)
.
α: На основании чего будемПредлагаю не скупиться на лишних несколько мегабайт и ставить компилятор GHC (+ его REPL-версию GHCi) с кипой разных модулей и некоторым ещё заместо интерпретатора с немного меньшей кипой. Там есть кое-что полезное. Собственно, хотя ссылка и была уже (притом не от меня) http://hackage.haskell.org/platform.
Из-за компиляторности текст стандартных модулей вы сможете посмотреть только на сайте в разделе документации (http://lambda.haskell.org/platform/doc/current/index.html), а не открывая какие попало из установленных файлов. :(
! Внутренне уникод поддерживается, но ввод-вывод его в REPL не гарантирован. О том, как вводить-выводить файлы в UTF-8, я скажу, когда придёт время и когда я найду, как это называется. Стандартный ввод-вывод, насколько я знаю, побайтовый без излишеств, что не мешает его украсить без хлопот тем, чем надо. Впрочем, об этом, действительно, позже — сейчас это только предупреждение не ждать его от REPL.
β: 2+2Итак; запустивши GHCi, мы увидим после нескольких сообщений о, надеюсь, удачной загрузке самого основного prompt вида
Prelude>. Он озанчает, что сейчас загружен стандартный модуль Prelude с основными определениями (которые, как правило, никому не мешают; выгрузить его не получится; а код его здесь (http://lambda.haskell.org/platform/doc/current/ghc-doc/libraries/haskell2010-1.0.0.0/Prelude.html)). Если нам нужны будут ещё, можно будет подгрузить их в REPL, введя
:load Имя1 Имя2 ... или просто
:l Те жеВведём пока кое-что бесполезное:
> 2 + 2 * 3
8Ладно хоть приоритет операций привычный.
γ: ТипыУ каждого выражения есть строго определённый тип (переменных-то нет, и потому нечему его менять даже при желании). К сожалению, это не даёт составлять списки вида
[1, 'a', False], как можно в Лиспе. Встроенные «простые» типы —
Int — целые фиксированного размера,
Integer — целые произвольной длины,
Char — символы,
Bool —
True и
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. Прошу не читать более ничего. Всё будет постепенно. ;-) То бишь, доверьтесь мне.