Ответ 1
Структура программы Haskell на удивление проста. У вас есть функция main
, которая делает IO, и об этом. Итак, основы:
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
и он должен создать исполняемую программу под названием program.
В общем, программы структурированы как в основном чистые функции, выполняющие фактическое вычисление в сочетании с дискретными частями кода, связанного с IO. (Конечно, есть исключения из этого, но общая идея написания максимально чистого кода является достаточно универсальной.)
Поскольку почти все выражается как куча чистых функций, вы не передаете между ними переменные - функции обмениваются передачей аргументов.
Часть вашего кода, который делает IO
, привязана к main
. В большинстве случаев все ваши IO собираются пройти через главную; даже если вы пишете IO-действия отдельно и даете им имена, они в конечном счете будут выполняться начиная с 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
.