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]

Hugs

Tipuscompilador Modifica el valor a Wikidata
Llicènciallicència BSD Modifica el valor a Wikidata
Característiques tècniques
Escrit enC Modifica el valor a Wikidata
Més informació
Lloc webhaskell.org… Modifica el valor a Wikidata

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