26 votos

Estructura básica de un programa Haskell

Muchos de los tutoriales de Haskell que he revisado se centran casi enteramente en la sintaxis con muy poca cobertura sobre cómo estructurar un programa.

Por ejemplo...

Aquí hay un esquema de barebones de una aplicación 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;
}

Cuando empecé a aprender C++, ejemplos como estos me ayudaron inmensamente a aprender cómo ensamblar piezas individuales en programas de trabajo. Tal vez estoy buscando en los lugares equivocados, pero no he sido capaz de encontrar ningún ejemplo que sea tan directo y simple para Haskell.

Ya conozco MUCHA sintaxis de Haskell. Puedo escribir comprensiones de listas recursivas, y manipular cuerdas, números enteros y listas del wazoo.

En resumen: Sólo quiero saber cómo se ven 2 subrutinas y pases variables en Haskell. Si puedo obtener un entendimiento básico de cómo estructurar un programa de Haskell, podría finalmente ser capaz de poner en práctica toda la sintaxis que he aprendido.

30voto

Tikhon Jelvis Puntos 30789

La estructura de un programa de Haskell es sorprendentemente simple. Tienes un main función que hace IO, y eso es todo. Así que lo básico:

module Main where

addition a b = a + b

main :: IO ()
main = do let z = addition 5 3
          putStrLn $ "The result is: " ++ show z

Ahora puedes compilar esto en un simple programa usando algo como:

ghc --make Main.hs -o program

y debería producir un ejecutable llamado programa.

En general, los programas están estructurados como funciones puras que hacen el cómputo real junto con partes discretas del código que tratan con el IO. (Por supuesto hay excepciones a esto, pero la idea general de escribir tanto código puro como sea posible es bastante universal).

Como casi todo se expresa como un montón de funciones puras, no se pasan variables entre ellas las funciones se comunican pasando argumentos.

La parte de tu código que hace IO está anclado en main . En la mayoría de los casos, todos su IO va a pasar por el principal; incluso si escribe las acciones de IO por separado y les da nombres, al final se ejecutarán a partir de main .

Un "grupo de funciones" en Haskell se llama "módulo". Puede tener múltiples módulos, cada uno en su propio archivo:

module Blarg (exportedFunction) where

helper a b = ... -- this will *not* be exported
exportedFunction a b = helper a b -- this *will* be exported

Sólo los identificadores entre paréntesis serán exportados; el resto están ocultos. Si no se incluyen los paréntesis en absoluto, todo se exportará por defecto.

Guarda este archivo como Blarg.hs . Ahora puedes importarlo en Main :

import Blarg

Otra forma útil de agrupar funciones es where :

complicatedFunction a b c = helper 0
  where helper count = ...

Por aquí. helper es sólo en el ámbito de complicatedFunction y también tiene acceso a a , b y c de complicatedFunction .

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X