Hugs (''Haskell User's Gofer System''), also Hugs 98, is a
bytecode
Bytecode (also called portable code or p-code) is a form of instruction set designed for efficient execution by a software interpreter. Unlike human-readable source code, bytecodes are compact numeric codes, constants, and references (normall ...
interpreter for the
functional
Functional may refer to:
* Movements in architecture:
** Functionalism (architecture)
** Form follows function
* Functional group, combination of atoms within molecules
* Medical conditions without currently visible organic basis:
** Functional sy ...
programming language Haskell. Hugs is the successor to
Gofer, and was originally derived from Gofer version 2.30b.
Hugs and Gofer were originally developed by Mark P. Jones, now a professor at
Portland State University
Portland State University (PSU) is a public research university in Portland, Oregon. It was founded in 1946 as a post-secondary educational institution for World War II veterans. It evolved into a four-year college over the following two dec ...
.
Hugs comes with a simple graphics library. As a complete Haskell implementation that is
portable
Portable may refer to:
General
* Portable building, a manufactured structure that is built off site and moved in upon completion of site and utility work
* Portable classroom, a temporary building installed on the grounds of a school to provide ...
and simple to install, Hugs is sometimes recommended for new Haskell users.
Hugs deviates from the Haskell 98 specification
in several minor ways. For example, Hugs does not support mutually recursive modules. A list of differences exists.
The Hugs prompt (a Haskell
REPL) accepts expressions for evaluation, but not module, type or function definitions. Hugs can load Haskell modules at start-up.
Examples
Extensible records
An example of "Typed records with extensibility", a non standard feature unique to Hugs.
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'
Running with H98 compatibility turned off to activate language extensions:
runhugs -98 test.hs
References
External links
* {{official website, http://www.haskell.org/hugs
Free Haskell implementations
Software using the BSD license