Hugs

From Wikipedia, the free encyclopedia

Remove ads

Hugs (Sistemul Gofer al utilizatorului Haskell), de asemenea, Hugs 98, este un interpret bytecode pentru limbaj de programare funcțională Haskell. Hugs este succesorul lui Gofer și a fost inițial derivat din Gofer versiunea 2.30b[3]. Hugs și Gofer au fost inițial dezvoltate de Mark P. Jones, acum profesor la Portland State University.

Mai multe informații Dezvoltator, Ultima versiune ...

Hugs vine cu o bibliotecă simplă de grafică. Ca o implementare completă Haskell, care este portabilă și ușor de instalat, Hugs este uneori recomandat pentru noii utilizatori Haskell.

Hugs se abate de la specificația Haskell 98[4] în câteva moduri minore[5]. De exemplu, Hugs nu acceptă module reciproc recursive. Există o listă de diferențe[6].

Interfața Hugs (un Haskell REPL) acceptă expresii pentru evaluare, dar nu definiții de module, tip sau funcții. Îmbrățișările pot încărca modulele Haskell la pornire[7].

Remove ads

Exemple

Înregistrări extinse

Un exemplu de "înregistrări tipărite cu extensibilitate", o caracteristică non-standard unică pentru Hugs[8].

module Main where

import Hugs.Trex

type Coord = Double
type Point2D = Rec (x::Coord, y::Coord) 
type Point3D = Rec (x::Coord, y::Coord, z::Coord) 

point2D = (x=1, y=1) :: Point2D

-- emptyRec :: Rec EmptyRow  -- predefined

-- (x=1 | (y=1))   -- rec. extension
-- (x=v | rec)     -- record value decomposition, pattern fields must be non empty
-- (x::type | rec)   -- record type decomposition

-- (rec\z) in the context means ''rec'' does not contain field ''z'' 

-- add a field z with the same type as field x
addZCoord :: (r\z, r\x) => t -> Rec ( x::t | r) -> Rec ( x::t, z::t | r)
addZCoord z ( x = x | other) = (x = x, z = z | other)

point3D = addZCoord 3 point2D   -- :: Point3D

-- admit any record with ''showable'' fields x and y 
printXY :: (Show t, r\x, r\y) => Rec (x::t, y::t | r) -> IO ()
printXY point = putStrLn xy
  -- with SML style field accessors ('#' prefix)
  where xy = show (#x point) ++", "++ show (#y point) 

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

main = do
  let point3D' = incrementX point3D
  printXY point2D
  printXY point3D'

Rularea cu compatibilitatea H98 oprită pentru a activa extensiile de limbă:[9]

runhugs -98 test.hs
Remove ads

Note

Legături externe

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads