Hugs

Hugs 98Developer(s)| Mark P. Jones, others

|

Final release|

September 2006 / September 21, 2006 (2006-09-21)

Operating system| Cross-platform
Predecessor| Gofer
Type| Compiler
License| BSD
Website| www.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 (a Haskell REPL) accepts expressions for evaluation, but not module, type or function definitions. Hugs can load Haskell modules at start-up.[5]

## Contents

* 1 Examples
* 1.1 Extensible records
* 2 References
* 3 External links

## Examples

### Extensible records

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

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:[7]

runhugs -98 test.hs

## References

1. ↑ "Frequently Asked Questions about Hugs". http://www.haskell.org/hugs/pages/users_guide/faq.html.
2. ↑ Simon Peyton Jones (editor) (December 2002). "Haskell 98 Language and Libraries: The Revised Report". http://haskell.org/onlinereport/.
3. ↑ "Haskell 98 non-compliance". The Hugs 98 User's Guide. http://www.haskell.org/hugs/pages/users_guide/haskell98.html#BUGS-HASKELL98.
4. ↑ "List of differences with H98 standard". http://www.haskell.org/hugs/pages/hugsman/diffs.html.
5. ↑ "Loading and editing Haskell module files". The Hugs 98 User's Guide. http://www.haskell.org/hugs/pages/users_guide/module-commands.html.
6. ↑ "Hugs-specific language extensions". http://www.haskell.org/hugs/pages/users_guide/hugs-only.html#TREX.
7. ↑ "Changing the behaviour of Hugs". http://www.haskell.org/hugs/pages/users_guide/options.html#OPTIONS-LANGUAGE.

## External links

0.00

(0 votes)

|

Retrieved from "https://handwiki.org/wiki/index.php?title=Software:Hugs&oldid=316355"