{-# LANGUAGE KindSignatures, GADTs, TypeFamilies, TypeOperators, MultiParamTypeClasses, DataKinds, RankNTypes #-}
import Control.Applicative
import Data.Traversable (Traversable)
class (Applicative f, Traversable f) => Dim f
data Shapely (fs :: [* -> *]) where
ShZ :: Shapely '[]
ShS :: (Dim f) => Shapely fs -> Shapely (f ': fs)
class SShapely (fs :: [* -> *]) where
shapely :: Shapely fs
instance SShapely '[] where
shapely = ShZ
instance (Dim f, SShapely fs) => SShapely (f ': fs) where
shapely = ShS shapely
-------------------------------------
-- Hypercuboid datatype
-------------------------------------
data Hyper :: [* -> *] -> * -> * where
Scalar :: a -> Hyper '[] a
Prism :: (Dim f, SShapely fs) =>
Hyper fs (f a) -> Hyper (f ': fs) a
fmap f
(Scalar a
) = Scalar
$ f a
applySh :: (SShapely fs => a) -> Shapely fs -> a
applySh k ShZ = k
applySh k (ShS s) = applySh k s
pureSh :: Shapely fs -> a -> Hyper fs a
pureSh ShZ x = Scalar x
pureSh (ShS s) x = applySh Prism s (pureSh s (pure x))
instance SShapely fs => Applicative (Hyper fs) where
pure = pureSh shapely
ey0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzLCBHQURUcywgVHlwZUZhbWlsaWVzLCBUeXBlT3BlcmF0b3JzLCBNdWx0aVBhcmFtVHlwZUNsYXNzZXMsIERhdGFLaW5kcywgUmFua05UeXBlcyAjLX0KCmltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCmltcG9ydCBEYXRhLlRyYXZlcnNhYmxlIChUcmF2ZXJzYWJsZSkKCmNsYXNzIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSBmKSA9PiBEaW0gZgoKZGF0YSBTaGFwZWx5IChmcyA6OiBbKiAtPiAqXSkgd2hlcmUKCVNoWiA6OiBTaGFwZWx5ICdbXQoJU2hTIDo6IChEaW0gZikgPT4gU2hhcGVseSBmcyAtPiBTaGFwZWx5IChmICc6IGZzKQoKY2xhc3MgU1NoYXBlbHkgKGZzIDo6IFsqIC0+ICpdKSB3aGVyZQoJc2hhcGVseSA6OiBTaGFwZWx5IGZzCgppbnN0YW5jZSBTU2hhcGVseSAnW10gd2hlcmUKCXNoYXBlbHkgPSBTaFoKCQppbnN0YW5jZSAoRGltIGYsIFNTaGFwZWx5IGZzKSA9PiBTU2hhcGVseSAoZiAnOiBmcykgd2hlcmUKCXNoYXBlbHkgPSBTaFMgc2hhcGVseQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSAgICAgICAgICAgIEh5cGVyY3Vib2lkIGRhdGF0eXBlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGF0YSBIeXBlciA6OiBbKiAtPiAqXSAtPiAqIC0+ICogd2hlcmUKICAgIFNjYWxhciA6OiBhIC0+IEh5cGVyICdbXSBhCiAgICBQcmlzbSAgOjogKERpbSBmLCBTU2hhcGVseSBmcykgPT4gCiAgICAgICAgICAgICAgICBIeXBlciBmcyAoZiBhKSAtPiBIeXBlciAoZiAnOiBmcykgYQoKaW5zdGFuY2UgRnVuY3RvciAoSHlwZXIgZnMpIHdoZXJlCiAgICBmbWFwIGYgKFNjYWxhciBhKSA9IFNjYWxhciAkIGYgYQogICAgZm1hcCBmIChQcmlzbSBwKSAgPSBQcmlzbSAkIGZtYXAgKGZtYXAgZikgcAoKYXBwbHlTaCA6OiAoU1NoYXBlbHkgZnMgPT4gYSkgLT4gU2hhcGVseSBmcyAtPiBhCmFwcGx5U2ggayAgU2haICAgID0gawphcHBseVNoIGsgKFNoUyBzKSA9IGFwcGx5U2ggayBzCgpwdXJlU2ggOjogU2hhcGVseSBmcyAtPiBhIC0+IEh5cGVyIGZzIGEKcHVyZVNoICBTaFogICAgeCA9IFNjYWxhciB4CnB1cmVTaCAoU2hTIHMpIHggPSBhcHBseVNoIFByaXNtIHMgKHB1cmVTaCBzIChwdXJlIHgpKQoKaW5zdGFuY2UgU1NoYXBlbHkgZnMgPT4gQXBwbGljYXRpdmUgKEh5cGVyIGZzKSB3aGVyZQoJcHVyZSA9IHB1cmVTaCBzaGFwZWx5CgptYWluID0gcHJpbnQgNDI=