packages feed

HList-0.3.0: examples/pun.hs

{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE ViewPatterns #-}
-- more examples for record puns
module Main where
import Data.HList.CommonMain

makeLabels6 (words "a b c")


r  = c .=. "c" .*. b .=. (a .=. 3 .*. emptyRecord) .*. emptyRecord
r2 = b .=. (a .=. 1 .*. emptyRecord) .*. emptyRecord


p1 ( (.!. b) -> (b @ ((.!. a) -> a))) = (a,b)

p2 [pun| b @ {a} |] = (a, b)

-- same as p2, but gives a warning
-- p3 [pun| b @ a |] = (a, b)

p4 [pun| b{a} |] = a -- b is not bound

-- adds `x' and `y' into a field called r
e1 = let x = 1; y = "hi" in [pun| r @ { x y } |]

-- updates the `c' field
e2 = let c = 1; y = "hi" in [pun| r @ { c y } |]

-- same as e1, but doesn't use a pre-existing r
e3 = let x = 1; y = "hi" in [pun| r { x y } |]


main = do
        putStrLn "similar:"
        print $ p1 r
        print $ p2 r
        print $ p4 r

        putStrLn "\nexpression QQ:"
        print $ e1
        print $ e2
        print $ e3