Hugs

De Viquipèdia
Salta a la navegació Salta a la cerca
Infotaula de programariHugs
Escrit enC modifica
Tipuscompilador modifica
Llicènciallicència BSD modifica
Més informació
Lloc webWeb oficial modifica

Hugs (Haskell User's Gofer System) és un intèrpret bytecode per al llenguatge funcional Haskell. Ofereix compilació ràpida i una velocitat d'execució acceptable. A més, inclou una llibreria gràfica simple. Hugs és una bona eina per a tota aquell que està aprenent les bases de Haskell, la qual cosa no implica que sigui una "implementació de joguina". Actualment l'intèrpret GHCi supera la capacitat de Hugs i més des que la versió 7.4 de GHCi admet tota mena de declaracions a nivell de mòdul.[1]

Llista de diferències amb l'estàndard Haskell 98 aquí.[2] Malgrat que diu que no suporta Unicode (només codif. Latin-1), al Linux amb codificació UTF-8 els accents funcionen tant a les cadenes de text com als identificadors.

Hugs és un programa de codi obert que disposa de versions per als sistemes operatius més difosos tals com Linux, BSD, Microsoft Windows o Mac OS X.

Per començar[modifica]

Activació de Hugs amb extensions pròpies[modifica]

Buscant l'extensió TRex (registres extensibles)[5] que molta gent troba a faltar a GHC.[6] Després de fer una mica d'arqueologia (pel nom TRex i lo amagat de l'activació), cal desactivar la compatibilitat amb Haskell98 (opció +98) canviant-la de signe -98:[7]

# per possibilitar els registres extensibles cal importar el mòdul corresp.

hugs -98 Hugs.Trex

Hugs.Trex> (a=True, b="Hello", c=12::Int | (b1="World"))
(a = True, b = "Hello", b1 = "World", c = 12)
Hugs.Trex> 

exemple:

-- fitxer prova.hs amb extensions específiques Hugs
module Main where

import Hugs.Trex

type Coord = Double
type Punt2D = Rec (x::Coord, y::Coord) 
type Punt3D = Rec (x::Coord, y::Coord, z::Coord)

punt2D = (x=1, y=1) :: Punt2D
 
-- emptyRec :: Rec EmptyRow  -- registre buit predefinit
-- (x=1 | (y=1))   -- extensió de registres
-- (x=v | rec)     -- patró de descomposició per encaix de valors de registres
-- (x::tipus | rec)   -- patró de descomposició per encaix de tipus de registres
 
-- (rec \ z) al context vol dir ''rec'' no conté el camp ''z'' 

-- afegeix un camp z del mateix tipus que el camp x
afegeixCoordZ :: (r\z, r\x) => t -> Rec ( x::t | r) -> Rec ( x::t, z::t | r)
afegeixCoordZ z ( x = x | resta_de_camps) = (x = x, z = z | resta_de_camps)
 
punt3D = afegeixCoordZ 3 punt2D :: Punt3D

-- accepta registres que continguin camps (x, y, ...) que implementin ''Show''
imprimeixXY :: (Show t, r\x, r\y) => Rec (x::t, y::t | r) -> IO ()
imprimeixXY punt = putStrLn xy
  where xy = show (#x punt) ++", "++ show (#y punt)

incrementaX :: (Num t, r\x) => Rec (x::t | r) -> Rec (x::t | r)
incrementaX (x=v | resta_de_camps) = (x=v+1 | resta_de_camps)

main = do
  let punt3D' = incrementaX punt3D
  imprimeixXY punt2D
  imprimeixXY punt3D'

Executant amb compatibilitat H98 desactivada per activar les extensions de llenguatge:[7]

runhugs -98 prova.hs

Referències[modifica]

Enllaços externs[modifica]