Abrazos - Hugs

Abrazos 98
Desarrollador (es) Mark P. Jones, otros
Lanzamiento final
Septiembre de 2006/21 de septiembre de 2006 ( 21 de septiembre de 2006 )
Sistema operativo Multiplataforma
Predecesor Gofer
Escribe Compilador
Licencia BSD
Sitio web www .haskell .org / hugs /

Hugs ( Haskell User's Gofer System ), también Hugs 98 , es un intérprete de código de bytes para el lenguaje de programación funcional Haskell . Hugs es el sucesor de Gofer y se derivó originalmente de la versión 2.30b de Gofer. Hugs and Gofer fueron desarrollados originalmente por Mark P. Jones, ahora profesor en la Universidad Estatal de Portland .

Hugs viene con una biblioteca de gráficos simple. Como una implementación completa de Haskell que es portátil y fácil de instalar, a veces se recomienda Hugs para los nuevos usuarios de Haskell.

Hugs se desvía de la especificación Haskell 98 de varias formas menores. Por ejemplo, Hugs no admite módulos recursivos entre sí. Existe una lista de diferencias.

El indicador Hugs (un REPL de Haskell ) acepta expresiones para evaluación, pero no definiciones de módulos, tipos o funciones. Los abrazos pueden cargar módulos Haskell al inicio.

Ejemplos de

Registros extensibles

Un ejemplo de "Registros mecanografiados con extensibilidad", una característica no estándar exclusiva de 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'

Ejecutando con la compatibilidad con H98 desactivada para activar las extensiones de idioma:

runhugs -98 test.hs

Referencias

enlaces externos