summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorhallgren <hallgren@chalmers.se>2015-02-09 16:24:33 +0000
committerhallgren <hallgren@chalmers.se>2015-02-09 16:24:33 +0000
commit8e4e8da105547abec4fe27e837d13bf45d78e31b (patch)
treea86f579081644bb89bad7500febb4313e2b0c871 /src/runtime
parent3509ee650dc3ec00af3c5039b6ac99bd92f45d7f (diff)
Translating linearization functions to Haskell: support for variants
By adding the flag -haskell=variants to the command line, GF will now generate linearization functions in Haskell that support variants. Variants are represented as lists in Haskell. Variants inside pre { ... } expressions are still ignored. TODO: apply some monad laws to generate more compact code (using an intermediate representation of the generated Haskell code, instead of pretty printing directly from the GF code).
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/haskell/PGF/Haskell.hs12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/runtime/haskell/PGF/Haskell.hs b/src/runtime/haskell/PGF/Haskell.hs
index e09f6635e..d77395518 100644
--- a/src/runtime/haskell/PGF/Haskell.hs
+++ b/src/runtime/haskell/PGF/Haskell.hs
@@ -2,7 +2,7 @@
-- with @gf -output-format=haskell -haskell=concrete@
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleInstances #-}
module PGF.Haskell where
-import Control.Applicative((<$>))
+import Control.Applicative((<$>),(<*>))
import Data.Char(toUpper)
import Data.List(isPrefixOf)
import qualified Data.Map as M
@@ -54,9 +54,15 @@ class Has_s r a | r -> a where proj_s :: r -> a
-- | Haskell representation of the GF record type @{s:t}@
data R_s t = R_s t deriving (Eq,Ord,Show)
-instance (EnumAll t) => EnumAll (R_s t) where
- enumAll = (R_s <$> enumAll)
+instance (EnumAll t) => EnumAll (R_s t) where enumAll = R_s <$> enumAll
instance Has_s (R_s t) t where proj_s (R_s t) = t
-- | Coerce from any record type @{...,s:t,...}@ field to the supertype @{s:t}@
to_R_s r = R_s (proj_s r)
+
+
+-- *** Variants
+
+infixr 5 +++
+
+xs +++ ys = (++) <$> xs <*> ys \ No newline at end of file