Hugs

De Viquipèdia
Dreceres ràpides: navegació, cerca

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 tot tipus 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 | modifica el codi]

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

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)     -- descomposició de valors de registres
-- (x::tipus | rec)   -- descomposició 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 z 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 | modifica el codi]

  1. Notes de la versió 7.4.1 - GHCi
  2. Diferències amb l'estàndard H98
  3. Paquets de Hugs a l'Ubuntu(anglès)
  4. WinHugs per a Windows(anglès)
  5. Extensió TRex de l'intèrpret Hugs
  6. Propostes per aconseguir registres extensibles a GHC (anglès)
  7. 7,0 7,1 manual de Hugs - Hugs language options(anglès)

Enllaços externs[modifica | modifica el codi]