branch | status |
---|---|
master |
|
develop |
Syntactic sugar for open-union
For Stack users
Add this library to extra-deps
in your stack.yaml
like the following.
...
extra-deps:
- git: https://github.com/nwtgck/open-union-sugar-haskell.git
commit: 24ad5c35054dc511308bb5186cf17784042c499a
...
Then, add open-union-sugar
to your package.yaml
like the following.
...
library:
dependencies:
- open-union-sugar
...
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
import Data.OpenUnion
import Data.OpenUnion.Sugar
main :: IO ()
main = do
let u1 :: Union '[Int, String]
u1 = [l|"hello"|]
print u1
-- => Union ("hello" :: [Char])
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
import Data.OpenUnion
import Data.OpenUnion.Sugar
main :: IO ()
main = do
let hlist1 :: [Union '[Char, Bool, String]]
hlist1 = [hlist|
'a'
, True
, "apple"
, 'z'
, False
, "orange"
|]
print hlist1
-- => [Union ('a' :: Char),Union (True :: Bool),Union ("apple" :: [Char]),Union ('z' :: Char),Union (False :: Bool),Union ("orange" :: [Char])]
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}
import Data.OpenUnion
import Data.OpenUnion.Sugar
type UnitList = [()]
showMyUnion :: Union '[Char, Int, String, UnitList] -> String
[ptn|
showMyUnion (c :: Char) = "char: " ++ show c
showMyUnion (i :: Int) = "int: " ++ show i
showMyUnion (s :: String) = "string: " ++ s
showMyUnion (l :: UnitList) = "list length: " ++ show (length l)
|]
main :: IO ()
main = do
let u1 :: Union '[Char, Int, String, UnitList]
u1 = [l|"hello"|]
putStrLn (showMyUnion u1)
-- => string: hello
let u2 :: Union '[Char, Int, String, UnitList]
u2 = [l|189 :: Int|]
putStrLn (showMyUnion u2)
-- => int: 189