generics-sop : deep flattening of nested algebraic values ?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

generics-sop : deep flattening of nested algebraic values ?

Marco Zocca
Hi all,

 I'm a bit at a loss regarding this: say we have a value from a nested
algebraic type (definitions at the bottom)

testT2 :: T2
testT2 = T2 B (Left 42)

a generic encoding computed with `from` only goes one level deep,
leaving the sub-terms as they are :

λ> from testT2
SOP (Z (I B :* (I (Left 42) :* Nil)))

However, is it possible to recursively encode and collect all the
sub-terms, until primitive types or enumerations are encountered? The
encoded sub-terms from the example above are as follows:

λ> from B
SOP (S (Z Nil))
λ> from (Left 32 :: Either Int Char)
SOP (Z (I 32 :* Nil))

where

{-# language DeriveGeneric #-}
import qualified GHC.Generics as G
import Generics.SOP

data T1 = A | B | C deriving (G.Generic)
instance Generic T1

data T2 = T2 { t21 :: T1 , t22 :: Either Int Char } deriving (G.Generic)
instance Generic T2
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
Reply | Threaded
Open this post in threaded view
|

Re: generics-sop : deep flattening of nested algebraic values ?

Arian van Putten
http://hackage.haskell.org/package/generics-mrsop comes with both a deep and a shallow encoding of datatypes.   


On Sat, Jan 26, 2019, 13:44 Marco Zocca <[hidden email] wrote:
Hi all,

 I'm a bit at a loss regarding this: say we have a value from a nested
algebraic type (definitions at the bottom)

testT2 :: T2
testT2 = T2 B (Left 42)

a generic encoding computed with `from` only goes one level deep,
leaving the sub-terms as they are :

λ> from testT2
SOP (Z (I B :* (I (Left 42) :* Nil)))

However, is it possible to recursively encode and collect all the
sub-terms, until primitive types or enumerations are encountered? The
encoded sub-terms from the example above are as follows:

λ> from B
SOP (S (Z Nil))
λ> from (Left 32 :: Either Int Char)
SOP (Z (I 32 :* Nil))

where

{-# language DeriveGeneric #-}
import qualified GHC.Generics as G
import Generics.SOP

data T1 = A | B | C deriving (G.Generic)
instance Generic T1

data T2 = T2 { t21 :: T1 , t22 :: Either Int Char } deriving (G.Generic)
instance Generic T2
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
Reply | Threaded
Open this post in threaded view
|

Re: generics-sop : deep flattening of nested algebraic values ?

Marco Zocca
Ah, thank you for the reference! However I prefer to stay within
generics-sop if possible. I am studying the implementations of `geq`
and `gshow` in `basic-sop`, since they look like they're doing what I
want.

> http://hackage.haskell.org/package/generics-mrsop comes with both a deep and a shallow encoding of datatypes.
>
> The paper is here: https://doi.org/10.1145/3240719.3241786
>
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.