Haskell как запустить программу

Хаскель — чисто-функциональный язык общего назначения, соединяющий недавние разработки в области проектирования языков программирования. Хаскель предоставляет функции высшего порядка, нестрогую семантику, статическую полиморфическую типизацию, определённые пользователем алгебраические типы данных, сопоставление с образцом, большие возможности при работе со списками, массивами, целыми числами с произвольной или фиксированной точностью и числами с плавающей точкой. См. Haskell 2010 Language Report.

Код, написанный на Хаскель, можно запустить по-разному:

  1. в режиме интерпретации;
  2. скомпилировав в исполняемый файл;
  3. запуск кода без компиляции;
  4. использование систем сборки.

Существуют различные реализации спецификации языка Хаскель. Рекомендуемой на официальном сайте является платформа GHC (Glasgow Haskell Compiler). Другие реализации, такие как UHC, LHC, а также различные диалекты языка (например Frege, компилируемый в байт код Java) использоваться в курсе не будут.

Haskell для начинающих — #2 урок. Установка и настройка среды

Режим интерпретации

Режим интерпретации запускает интерпретатор в консоли, в котором выражения вводятся непосредственно в командной строке. Для запуска интерпретатора вызывается команда ghci :

markoutte$ ghci GHCi, version 8.0.2: http://www.haskell.org/ghc/ 😕 for help Prelude> :help

Для выхода из режима интерпретации необходимо выполнить команду :q или нажать Ctrl + D .

Найдём корни квадратного уравнения:

Prelude> : < Prelude| findRoots a b c = if d < 0 then error «No roots» else (x1, x2) Prelude| where Prelude| d = b ^ 2 — 4 * a * c Prelude| x1 = (-b — sqrt d) / (2 * a) Prelude| x2 = (-b + sqrt d) / (2 * a) Prelude| :>Prelude> print $ findRoots 1 2 1 (-1.0,-1.0)

Команды : < и :>позволяют обозначить начало многострочного кода. Полный список команд интерпретатора можно узнать набрав команду :help . При этом Хаскель автоматически выведет тип аргументов заданной функции:

Prelude> :t findRoots findRoots :: (Ord t, Floating t) => t -> t -> t -> (t, t) Prelude>

Такую запись следует читать следующим образом: :: => . Таким образом, применить функцию для целых типов не получится:

Prelude> a = 2 :: Int Prelude> b = 3 :: Int Prelude> c = 1 :: Int Prelude> findRoots a b c :26:1: error: • No instance for (Floating Int) arising from a use of ‘findRoots’ • In the expression: findRoots a b c In an equation for ‘it’: it = findRoots a b c

Компиляция в исполняемый файл

Создадим 2 файла: Main.hs для основной программы и Math.hs для математических функций:

module Main where import Math main = print (findRoots 2 4 1)
module Math where findRoots a b c = if d < 0 then error «No roots» else (x1, x2) where d = b ^ 2 — 4 * a * c x1 = (-b — sqrt d) / (2 * a) x2 = (-b + sqrt d) / (2 * a)

Скомпилируем и запустим код:

markoutte$ ghc Main.hs [1 of 2] Compiling Math ( Math.hs, Math.o ) [2 of 2] Compiling Main ( Main.hs, Main.o ) Linking Main . markoutte$ ls -l total 3784 -rwxr-xr-x 1 markoutte staff 1901680 19 фев 22:32 Main -rw-r—r— 1 markoutte staff 848 19 фев 22:32 Main.hi -rw-r—r— 1 markoutte staff 62 19 фев 22:29 Main.hs -rw-r—r— 1 markoutte staff 3304 19 фев 22:32 Main.o -rw-r—r— 1 markoutte staff 1002 19 фев 22:32 Math.hi -rw-r—r— 1 markoutte staff 181 19 фев 22:28 Math.hs -rw-r—r— 1 markoutte staff 10128 19 фев 22:32 Math.o markoutte$ ./Main (-1.7071067811865475,-0.2928932188134524)

В то время, как .o файлы являются скомпилированными в бинарный формат модулями (объектными модулями), файлы .hi хранят информацию о самом модуле и его зависимостях. Посмотреть, что там хранится можно, использовав команду ghc —show-iface Main.hi . Подробней об этом можно прочитать в статье Using GHC.

Как установить GHC? Душкин объяснит

Запуск без компиляции

Код на хаскеле можно запустить без компиляции, выполнив следующие команды:

markoutte$ runhaskell Main.hs (-1.7071067811865475,-0.2928932188134524) Eltanin:example markoutte$ ls -l total 16 -rw-r—r— 1 markoutte staff 62 19 фев 22:29 Main.hs -rw-r—r— 1 markoutte staff 181 19 фев 22:28 Math.hs

Использование Cabal Stack

Cabal — это система сборки, поставляемая вместе с платформой Хаскель. На сегодняшний день (февраль 2017) набирает популярность другая система сборки и менеджер зависимостей — Stack.

Работа с ним хорошо описана в статье «Прощай, cabal. Здравствуй, stack!» и «Practical haskell — getting started with stack».

Например, чтобы запустить простой вебсервер на Yesod, достаточно выполнить следующие команды:

После этого доступ к странице можно получить по адресу http://localhost:3000 . Редактирование зависимостей от других библиотек происходит в файле .cabal . Подробнее об этом в User guide. Например, чтобы успешно собрать и запустить следующий пример, взятого для разработки пользовательского интерфейса на базе веб технологий:

достаточно добавить в файл .cabal следующие зависимости: threepenny-gui >= 0.7.0.1, сontainers >= 0.5.7.1.

Материал дополняется, поэтому любые комментарии и исправления приветствуются.

Сообщите об опечатке, выделив ошибку в тексте и нажав на Ctrl + Enter .

Что ещё почитать?

Learn You a Haskell for Great Good!

Hey yo! This is Learn You a Haskell, the funkiest way to learn Haskell, which is the best functional programming language around. You may have heard of it. This guide is meant for people who have programmed already, but have yet to try functional programming.

Читайте также:
Написать программу которая выводит на экран два шара красный стоит на месте а зеленый

Изучаем Haskell

От издателя Эта книга поможет вам быстро освоить базовые концепции языка программирования Haskell, его библиотеки и компоненты, а также заложит основы функциональной парадигмы программирования, которая становится все более значимой в современном мире разработки ПО. Книга предлагает проектный подход к освоению материала, используя в качестве прототипа проект реализации интернет-магазина. Здесь рассматривается экосистема языка Haskell и его вспомогательных средств, инструменты Cabal для управление проектами, модули HUnit и QuickCheck для тестирования программ, фреймворк Scotty для разработки веб-приложений, Persistent и Esqueleto – для управления базами данных и многие другие компоненты и библиотеки Haskell.

What i wish i knew when learning haskell

Источник: markoutte.me

5.1.Использование GHC

В этой главе вы найдете полное руководство по синтаксису командной строки GHC,включая все 400 с лишним флагов.Это большая и сложная система,в ней много деталей,поэтому может быть довольно трудно понять,как начать работу.Учитывая это,в этом вводном разделе дается краткое представление о базовом использовании GHC для компиляции программы на Haskell,а в следующих разделах мы погрузимся в полный синтаксис.

Давайте создадим программу Hello World, скомпилируем и запустим ее. Сначала создайте файл hello.hs , содержащий код Haskell:

main = putStrLn «Hello, World!»

Чтобы скомпилировать программу,используйте GHC вот так:

$ ghc hello.hs

(где $ представляет приглашение: не вводите его). GHC скомпилирует исходный файл hello.hs , создав объектный файл hello.o и файл интерфейса hello.hi , а затем свяжет объектный файл с библиотеками, которые поставляются с GHC, для создания исполняемого файла hello в Unix/Linux . /Mac или hello.exe в Windows.

По умолчанию GHC будет очень тихо рассказывать о том, что он делает, только печатая сообщения об ошибках. Если вы хотите более подробно увидеть, что происходит за кулисами, добавьте -v в командную строку.

Тогда мы сможем запустить программу вот так:

$ ./hello Hello World!

Если ваша программа содержит несколько модулей, вам нужно только сообщить GHC имя исходного файла, содержащего Main модуль, и GHC проверит объявления import чтобы найти другие модули, составляющие программу, и найти их исходные файлы. Это означает, что, за исключением Main модуля, каждый исходный файл должен быть назван в честь имени модуля, который он содержит (с точками, замененными разделителями каталогов). Например, модуль Data.Person будет в файле Data/Person.hs в Unix / Linux / Mac или DataPerson.hs в Windows.

5.1.2.Обзор опций

Поведение GHC контролируется опциями,которые по историческим причинам также иногда называют флагами командной строки или аргументами.Опции могут быть заданы тремя способами:

5.1.2.1.Аргументы командной строки

Вызов GHC принимает следующую форму:

ghc [argument. ]

Аргументами командной строки являются либо опции,либо имена файлов.

Параметры командной строки начинаются с — . Они могут не быть сгруппированы: -vO отличается от -v -O . Опции не должны предшествовать именам файлов: например, ghc *.o -o foo . Все параметры обрабатываются и затем применяются ко всем файлам; вы не можете, например, Invoke ghc -c -O1 Foo.hs -O2 Bar.hs применять различные уровни оптимизации к файлам Foo.hs и Bar.hs .

Помимо передачи аргументов через командную строку, аргументы можно передавать через файлы ответов в стиле GNU. Например,

Обратите внимание, что параметры командной строки зависят от порядка , а аргументы оцениваются слева направо. Это может иметь, казалось бы, странные эффекты в присутствии флага. Например, рассмотрите -fno-specialise и -O1 (что подразумевает -fspecialise ). Эти две командные строки означают очень разные вещи:

-fspecialise будет включен, поскольку -fno-specialise переопределен параметром -O1 .

-fspecialise не будет включен, так как -fno-specialise отменяет -fspecialise подразумеваемого -O1 .

5.1.2.2.Параметры командной строки в исходных файлах

Иногда бывает полезно установить тесную связь между исходным файлом и параметрами командной строки, которые для этого требуются. Например, если исходный файл Haskell намеренно использует -Wno-name-shadowing копирование имен, он должен быть скомпилирован с параметром -Wno-name-shadowing . Вместо того , чтобы поддерживать список опций для каждого файла в Makefile , можно сделать это непосредственно в исходном файле с помощью OPTIONS_GHC прагму

# OPTIONS_GHC -Wno-name-shadowing #-> module X where .

OPTIONS_GHC — это прагма заголовка файла (см. Прагму OPTIONS_GHC ).

В OPTIONS_GHC можно использовать только динамические флаги (см. Параметры Dynamic и Mode ).

Обратите внимание, что ваша командная оболочка не получает доступ к параметрам исходного файла, они просто включаются буквально в массив аргументов командной строки, которые компилятор поддерживает внутри, поэтому вы будете отчаянно разочарованы, если попытаетесь выполнить glob и т. д. внутри OPTIONS_GHC .

Содержимое OPTIONS_GHC добавляется к параметрам командной строки, поэтому параметры, указанные в исходном файле, переопределяют параметры, указанные в командной строке.

Не рекомендуется перемещать все содержимое ваших файлов Makefile в ваши исходные файлы, но в некоторых случаях прагма OPTIONS_GHC является правильной вещью. (Если вы используете -keep-hc-file и имеете флаги OPTION в своем модуле, OPTIONS_GHC будет помещен в сгенерированный файл .hc ).

5.1.2.3.Установка опций в GHCi

Параметры также можно изменить из GHCi с помощью команды :set .

5.1.3.Опции Динамический и Режим

Каждый из параметров командной строки GHC классифицируется как динамический или режим:

Режим: режим можно использовать только в командной строке. Вы можете передать только один флаг режима. Например, —make или -E . Доступные режимы перечислены в разделе «Режимы работы» .

Читайте также:
Лучшая программа для работы с сетью

Динамический: динамический флаг можно использовать в командной строке, в прагме OPTIONS_GHC в исходном файле или установить с помощью :set в GHCi.

В справочных таблицах флагов ( Flag reference ) перечислены состояния каждого флага.

5.1.4.Значимые суффиксы файлов

Имена файлов со «значимыми» суффиксами (например, .lhs или .o ) приводят к тому, что с этими файлами происходит «правильно».

.hs Модуль Хаскелла. .lhs

Модуль «грамотного Хаскеля».

.hspp Файл,созданный препроцессором. .hi Файл интерфейса Хаскелла,вероятно,сгенерированный компилятором. .hie Расширенный файл интерфейса Haskell,созданный компилятором Haskell. .hc Промежуточный C-файл,созданный компилятором Haskell. .c Файл на Си,не созданный компилятором Haskell. .ll Файл исходного текста на языке llvm-intermediate-language,обычно создаваемый компилятором. .bc Файл с биткодом на языке lvm-intermediate-language,обычно создаваемый компилятором. .s Исходный файл на языке ассемблера,обычно создаваемый компилятором. .o Объектный файл,созданный ассемблером.

Файлы с другими суффиксами (или без суффиксов)передаются прямо в компоновщик.

5.1.5.Режимы работы

Поведение GHC в первую очередь контролируется флагом режима.Может быть задан только один из этих флагов,но он не обязательно должен быть первым в командной строке.Например,

$ ghc Main.hs —make -o my-application

Если флаг режима отсутствует, то GHC перейдет в режим —make ( используя ghc —make ), если в командной строке указаны какие-либо исходные файлы Haskell, или же он свяжет объекты, указанные в командной строке, для создания исполняемый.

Флаги доступного режима:

Интерактивный режим, который также доступен как ghci . Интерактивный режим более подробно описан в разделе Использование GHCi .

Запустите main точку входа скрипта. Подобно runghc , по умолчанию будет использоваться интерпретатор байт-кода. Если командная строка содержит аргумент — , то все последующие аргументы будут переданы сценарию. Все предшествующие — аргументы интерпретируются как аргументы GHC.

В этом режиме GHC автоматически создаст многомодульную программу на Haskell, выяснив зависимости для себя. Если у вас есть простая программа на Haskell, это, вероятно, будет намного проще и быстрее, чем использование make . Режим Make описан в разделе Использование ghc —make .

Этот режим используется по умолчанию, если в командной строке упоминаются какие-либо исходные файлы Haskell, и в этом случае параметр —make можно не указывать.

Режим выражения-оценки. Это очень похоже на интерактивный режим, за исключением того, что для оценки используется одно выражение (⟨expr⟩), которое задается в командной строке. Этот флаг может быть задан несколько раз, и в этом случае каждое выражение вычисляется последовательно. Дополнительные сведения см. в разделе Режим оценки выражения .

Остановить после предварительной обработки ( файл .hspp )

Остановить после создания C ( файла .hc )

Остановить после создания сборки ( файл .s )

Остановить после создания файла объекта ( .o )

Это традиционный режим пакетного компилятора, в котором GHC может компилировать исходные файлы по одному или связывать объекты вместе в исполняемый файл. См. Режим пакетного компилятора .

Объедините набор статических объектных файлов в библиотеку, оптимизированную для загрузки в GHCi. См. Сборка библиотек GHCI .

Режим генерации зависимостей. В этом режиме GHC можно использовать для генерации информации о зависимостях, пригодной для использования в Makefile . См. Создание зависимостей .

Запустите GHC, используя данный внешний плагин. Подробнее см. Плагины внешнего интерфейса .

Создайте общий объект (или, в Windows, DLL). См. Создание DLL .

Причина,по которой GHC выдает сообщение о длительном использовании на стандартный выход,а затем выходит.

Прочтите интерфейс в «файле» и выгрузите его как текст в стандартный stdout . Например ghc —show-iface M.hi .

Печать поддерживаемых языковых расширений.

Распечатайте поддерживаемые параметры командной строки.Этот флаг может быть использован для автозавершения в оболочке.

Распечатать информацию о компиляторе.

Выведите однострочную строку,включающую номер версии GHC.

Выведите только числовой номер версии GHC.

Выведите числовую версию двоичного файла GHC,используемого для загрузки сборки этого компилятора.

Выведите целевую строку платформы сборки, на которой был построен GHC, сгенерированную GNU Autotools. Формат: cpu-manufacturer-operating_system-(kernel) , например, x86_64-unknown-linux .

Список флагов,передаваемых компилятору языка C во время сборки GHC.

Список флагов,передаваемых компилятору C для этапа компоновки во время сборки GHC.

Выведите True , если GHC был собран с флагом -DDebug . Это включает утверждения и дополнительный код отладки. Флаг может быть установлен в GhcStage1HcOpts и/или GhcStage2HcOpts и автоматически устанавливается для вариантов сборки devel1 и devel2 .

Напечатайте путь к глобальному каталогу базы данных пакетов GHC. База данных пакетов хранит сведения об установленных пакетах в виде каталога, содержащего файл для каждого пакета. Этот флаг печатает путь к глобальной базе данных, поставляемой с GHC, и выглядит примерно так: /usr/lib/ghc/package.conf.d в Unix. Могут быть и другие базы данных пакетов, например, пользовательская база данных пакетов. Дополнительные сведения см . в разделе Базы данных пакетов .

Выведите YES , если GHC был скомпилирован для включения интерпретатора, иначе NO .Если в этот GHC не включен интерпретатор, запуск его в интерактивном режиме (см. —interactive ) вызовет ошибку. Это относится только к интерактивному использованию GHC, а не к отдельным двоичным файлам GHCi (см. Использование GHCi ).

Выведите YES , если собственный генератор кода поддерживает целевую платформу, иначе NO .(См. Генератор собственного кода (-fasm) )

Выведите целевую строку хост-платформы, т. е. ту, на которой должен работать GHC, сгенерированную GNU Autotools. Формат: cpu-manufacturer-operating_system-(kernel) , например, x86_64-unknown-linux .

Читайте также:
Технические характеристики программы автокад

Выведите YES , если GHC был скомпилирован для использования символов с подчеркиванием в начале в объектных файлах, иначе NO .Обычно это зависит от целевой платформы.

Распечатайте путь к каталогу библиотеки GHC. Это вершина дерева каталогов, содержащего библиотеки, интерфейсы и включаемые файлы GHC (обычно что-то вроде /usr/local/lib/ghc-5.04 в Unix). Это значение $libdir в файле конфигурации пакета (см. Пакеты ).

Выведите флаги linke,используемые для компиляции GHC.

Выведите YES , если GHC был скомпилирован с поддержкой разделения сгенерированных объектных файлов на более мелкие объекты, в противном случае NO . Эта функция использует методы, зависящие от платформы, и может быть доступна не на всех платформах. Подробнее см. -split-objs .

Выведите идентификатор коммита Git,из которого был собран этот GHC.Это можно использовать для отслеживания текущего бинарного файла до определенной ревизии,что особенно полезно при разработке самого GHC.Устанавливается скриптом configure.

Выведите версию,установленную в сценарии configure во время сборки.Это просто версия GHC.

Пакеты,как и система времени выполнения,могут быть построены различными способами:-профилирование-с поддержкой профилирования-динамический-с динамическим связыванием-протоколирование-протоколирование событий RTS-потоковый-многопоточный RTS-отладочный-RTS с отладочной информацией

Возможны различные комбинации этих вкусов.

GHC собирается с помощью самого GHC,и эта сборка происходит в несколько этапов,которые пронумерованы.

  • Этап 0-это установленный у вас GHC.Установленный GHC также называют «загрузочным компилятором».
  • Этап 1-это первый GHC,который мы собираем,используя этап 0.Этап 1 затем используется для сборки пакетов.
  • Этап 2-это второй GHC,который мы собираем,используя этап 1.Именно его мы обычно устанавливаем,когда вы говорите make install.
  • Этап 3 является необязательным,но иногда строится для проверки этапа 2.

Stage 1 не поддерживает интерактивное выполнение (GHCi)и Template Haskell.

Выведите YES , если GHC был собран с поддержкой мультипроцессора, иначе NO .

Выведите YES , если GHC был собран с флагом —enable-tables-next-to-code , иначе NO .Этот параметр включен по умолчанию, так как он создает более эффективную компоновку кода.

Выведите целевую строку целевой платформы, т. е. ту, на которой будут запускаться сгенерированные двоичные файлы, сгенерированные GNU Autotools. Формат: cpu-manufacturer-operating_system-(kernel) , например, x86_64-unknown-linux .

Выведите YES , если этот GHC был собран в незарегистрированном режиме, иначе NO .«Незарегистрированный» означает, что GHC отключит большинство трюков и оптимизаций, специфичных для платформы. Будут доступны только генераторы кода LLVM и C. Подробнее см. Незарегистрированная компиляция .

5.1.5.1. Использование ghc —make

В этом режиме GHC создаст многомодульную программу на Haskell, следуя зависимостям от одного или нескольких корневых модулей (обычно только Main ). Например, если ваш Main модуль находится в файле с именем Main.hs , вы можете скомпилировать и связать программу следующим образом:

ghc —make Main.hs

На самом деле,GHC автоматически переходит в режим make,если в командной строке есть исходные файлы Haskell,а другой режим не указан,поэтому в данном случае мы можем просто напечатать

ghc Main.hs

Может быть указано любое количество имен исходных файлов или модулей; GHC определит все модули в программе, следуя импорту из этих начальных модулей. Затем он попытается скомпилировать каждый модуль, который устарел, и, наконец, если есть Main модуль, программа также будет связана с исполняемым файлом.

Основные преимущества использования ghc —make по сравнению с традиционными Makefile :

  • GHC не нужно перезапускать для каждой компиляции, что означает, что он может кэшировать информацию между компиляциями. Компиляция многомодульной программы с помощью ghc —make может быть в два раза быстрее, чем запуск ghc по отдельности для каждого исходного файла.
  • Вам не нужно писать Makefile .
  • GHC пересчитывает зависимости каждый раз при его вызове,поэтому эти зависимости никогда не выходят из синхронизации с источником.
  • Используя флаг -j[⟨n⟩] , вы можете компилировать модули параллельно. Укажите -j ⟨n⟩ для параллельной компиляции заданий ⟨n⟩. Если ⟨n⟩ опущено, то по умолчанию используется количество процессоров.

Любые параметры командной строки, описанные в оставшейся части этой главы, можно использовать с —make , но обратите внимание, что любые параметры, указанные в командной строке, будут применяться ко всем скомпилированным исходным файлам, поэтому, если вы хотите применить какие-либо параметры только для одного исходного файла вам потребуется использовать прагму OPTIONS_GHC (см. Параметры командной строки в исходных файлах ).

Если программу необходимо связать с дополнительными объектами (скажем,с каким-то вспомогательным C-кодом),то объектные файлы можно передать в командной строке,а GHC включит их при компоновке исполняемого файла.

Для обратной совместимости с существующими сценариями make при использовании в сочетании с -c этап компоновки опускается (так же, как —make -no-link ).

Обратите внимание,что GHC может следовать за зависимостями только в том случае,если у него есть исходный файл,поэтому если ваша программа включает модуль,для которого нет исходного файла,даже если у вас есть объект и файл интерфейса для модуля,то GHC будет жаловаться.Исключение из этого правила составляют пакетные модули,которые могут иметь или не иметь файлов с исходным кодом.

Исходные файлы программы не обязательно должны находиться в одном каталоге; параметр -i можно использовать для добавления каталогов к пути поиска (см . Путь поиска ).

По возможности выполняйте компиляцию параллельно.При компиляции GHC будет использовать до ⟨N⟩ потоков.Если N опущено,то по умолчанию это количество процессоров.Обратите внимание,что компиляция модуля может начаться только после сборки его зависимостей.

Источник: runebook.dev

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru