Структура программы на Haskell удивительно проста.У вас есть main
функция, которая выполняет ввод-вывод, и это все.Итак, основы:
module Main where
addition a b = a + b
main :: IO ()
main = do let z = addition 5 3
putStrLn $ "The result is: " ++ show z
Теперь вы можете скомпилировать это в простую программу, используя что-то вроде:
ghc --make Main.hs -o program
, и она должна создать исполняемый файл с именем программы.
В общем, программы структурированы как в основном чистые функции, выполняющие фактические вычисления в сочетании с дискретными частями кода, связанными с IO.(Есть, конечно, исключения из этого, но общая идея написания как можно большего количества чистого кода достаточно универсальна.)
Поскольку почти все выражается в виде набора чистых функций, вы не передаете переменные междуони - функции обмениваются передачей аргументов.
Часть вашего кода, которая выполняет IO
, привязана к main
.В большинстве случаев все ваш IO будет проходить через main;даже если вы напишите действия ввода-вывода отдельно и дадите им имена, они в конечном итоге будут выполняться, начиная с main
.
«Функциональная группа» в Haskell называется «модулем».Вы можете иметь несколько модулей, каждый в своем собственном файле:
module Blarg (exportedFunction) where
helper a b = ... -- this will *not* be exported
exportedFunction a b = helper a b -- this *will* be exported
Только идентификаторы в скобках будут фактически экспортированы;остальные скрыты.Если вы вообще не включите скобки, по умолчанию все будет экспортировано.
Сохраните этот файл как Blarg.hs
.Теперь вы можете импортировать его в Main
:
import Blarg
Другой полезный способ группировки функций - это where
:
complicatedFunction a b c = helper 0
where helper count = ...
Таким образом, helper
доступен только для complicatedFunction
, а также имеет доступ к a
, b
и c
с complicatedFunction
.