Hugs (interpreter)

Hugs 98
DevelopersMark P. Jones, others
Final release
September 2006 / September 21, 2006; 19 years ago (2006-09-21)
Written inHaskell
Operating systemCross-platform
PredecessorGofer
TypeCompiler
LicenseBSD
Websitewww.haskell.org/hugs

Hugs (Haskell User's Gofer System), also Hugs 98, is a bytecode interpreter for the functional programming language Haskell. Hugs is the successor to Gofer, and was originally derived from Gofer version 2.30b.[1] Hugs and Gofer were originally developed by Mark P. Jones, now a professor at Portland State University.

Hugs comes with a simple graphics library. As a complete Haskell implementation that is portable and simple to install, Hugs is sometimes recommended for new Haskell users.

Hugs deviates from the Haskell 98 specification[2] in several minor ways.[3] For example, Hugs does not support mutually recursive modules. A list of differences exists.[4]

The Hugs prompt is a Haskell read–eval–print loop (REPL). It accepts expressions for evaluation, but not module, type, or function definitions. Hugs can load Haskell modules at start-up.[5]

Examples

Extensible records

An example of "typed records with extensibility", a non-standard feature unique to Hugs.[6]

module Main whereimport Hugs.Trextype Coord = Doubletype 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 xaddZCoord :: (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'

Running with H98 compatibility turned off to activate language extensions:[7]

runhugs -98 test.hs

References

  1. ^ "Frequently Asked Questions about Hugs". Retrieved 2006-08-04.
  2. ^ Peyton Jones, Simon, ed. (December 2002). Haskell 98 Language and Libraries: The Revised Report (Report). Retrieved 2006-08-03.
  3. ^ "Haskell 98 non-compliance". The Hugs 98 User's Guide. Retrieved 2006-08-04.
  4. ^ "List of differences with H98 standard".
  5. ^ "Loading and editing Haskell module files". The Hugs 98 User's Guide. Retrieved 2006-08-04.
  6. ^ "Hugs-specific language extensions". www.haskell.org.
  7. ^ "Changing the behaviour of Hugs". www.haskell.org.
  • Official website
Retrieved from "https://en.wikipedia.org/w/index.php?title=Hugs_(interpreter)&oldid=1270420779"