-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathSum.hs
More file actions
38 lines (32 loc) · 1.04 KB
/
Sum.hs
File metadata and controls
38 lines (32 loc) · 1.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
{-|
Module : Examples.Sum
Description : Example of a projection from a 2-element sum.
Copyright : (c) Alexander Vieth, 2015
Licence : BSD3
Maintainer : aovieth@gmail.com
Stability : experimental
Portability : non-portable (GHC only)
-}
{-# LANGUAGE AutoDeriveTypeable #-}
{-# LANGUAGE TypeOperators #-}
module Examples.Sum where
import Control.Arrow
import Data.Void
import Data.Algebraic.Index
import Data.Algebraic.Sum
import Data.Algebraic.Product
import Data.Algebraic.Function
makeVoid :: F Partial Bijection t Void
makeVoid = F fto ffrom
where
fto :: Partial t Void
fto = Kleisli (\_ -> Nothing)
ffrom :: Bijection Void t
ffrom = arr absurd
selectFirst :: F Partial Bijection (s :+: t) s
selectFirst = eliminateSummand two <.> sumF (identity .*. makeVoid)
-- | runKleisli (to example) (inject two "foo") = Nothing
-- runKleisli (to example) (inject one (1 :: Int)) = Just 1
-- runIdentity . runKleisli (from example) :: Int -> (Int :+: String)
example :: F Partial Bijection (Int :+: String) Int
example = selectFirst