Подтвердить что ты не робот

Основная структура программы Haskell

Многие из учебных пособий Haskell, которые я просматривал, почти полностью сосредоточены на синтаксисе с очень небольшим освещением о том, как структурировать программу.

Например...

Вот контур barebones для приложения С++:

#include <iostream>
using namespace std;

int addition (int a, int b)
{
  int r;
  r=a+b;
  return (r);
}

int main ()
{
  int z;
  z = addition (5,3);
  cout << "The result is " << z;
  return 0;
}

Когда я впервые начал изучать С++, подобные примеры очень помогли мне научиться собирать отдельные части в рабочие программы. Возможно, я ищу не в том месте, но я не смог найти таких примеров, которые так же просты для Haskell.

Я уже знаю много синтаксиса Haskell. Я могу написать рекурсивные списки, а также манипулировать строками, целыми числами и списками wazoo.

Короче: Я просто хочу знать, как выглядят две подпрограммы и переменная pass в Haskell. Если я смогу получить некоторое базовое представление о том, как структурировать программу Haskell, я, возможно, наконец смогу применить весь синтаксис, который я изучил, для использования.

4b9b3361

Ответ 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.