[Haskell-cafe] Re: labels in HList

oleg at okmij.org oleg at okmij.org
Wed Oct 22 07:54:42 EDT 2008

It seems that a couple of modules in HList libraries didn't have
enough LANGUAGE pragmas (in one case, GHC 6.8.3 started to require
ScopedTypeVariables where the previous version of GHC did not). Cabal
and OOHaskell supply all needed extensions on the command line, and so
see no problems. I have corrected the pragmas, in

You example indeed requires three more imports. In addition, if you
import MakeLables and enable TemplateHaskell extension, you can define
labels in a simpler way, for example

	$(label "varX")
	$(label "getX")

The complete example follows. Also, the following file
might possibly serve as a quite detailed example of extensible
records. As the name of the file indicates, it is the OCaml Object
tutorial (part of the OCaml documentation), only implemented in

{-# LANGUAGE EmptyDataDecls, TemplateHaskell #-}

module Tst where

import Data.HList
import Data.HList.Label4
import Data.HList.TypeEqGeneric1
import Data.HList.TypeCastGeneric1
import Data.HList.MakeLabels

data Foo;   foo    = proxy::Proxy Foo
data Bar;   bar    = proxy::Proxy Bar
rec1 = foo .=. 1 .*.
       bar .=. "hello" .*.

-- Ralf likes this style
rec2 =  foo .=. 1 
    .*. bar .=. "hello" 
    .*. emptyRecord

t1 = rec2 # bar
-- "hello"

-- inferred foosel :: (HasField (Proxy Foo) r v) => r -> v
foosel x = x # foo

t2 = foosel rec1
-- 1

$(label "varX")
$(label "getX")
$(label "moveX")

rec3 = varX .=. True .*. rec2

t4 = rec3 # varX
-- True

More information about the Haskell-Cafe mailing list