Базовая структура программы на Haskell - PullRequest
30 голосов
/ 06 февраля 2012

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

Например ...

Вот простой набросок приложения C ++:

#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;
}

Когда я впервые начал изучать C ++, подобные примеры очень помогли мне научиться собирать отдельные части в рабочие программы. Может быть, я смотрю в неправильных местах, но я не смог найти таких примеров, которые были бы прямыми и простыми для Хаскелла.

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

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

1 Ответ

33 голосов
/ 06 февраля 2012

Структура программы на 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.

...