{-# LANGUAGE KindSignatures, GADTs, TypeFamilies, TypeOperators, MultiParamTypeClasses, DataKinds #-}
import Control.Applicative
import Data.Traversable (Traversable)
class (Applicative f, Traversable f) => Dim f
data Shapely (fs :: [* -> *]) where
ShZ :: Shapely '[]
ShS :: (Dim f, SShapely 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
-------------------------------------
-- 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
pureSh :: Shapely fs -> a -> Hyper fs a
pureSh ShZ x = Scalar x
pureSh ShS x = Prism (pureSh shapely (pure x))
instance SShapely fs => Applicative (Hyper fs) where
pure = pureSh shapely
ey0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzLCBHQURUcywgVHlwZUZhbWlsaWVzLCBUeXBlT3BlcmF0b3JzLCBNdWx0aVBhcmFtVHlwZUNsYXNzZXMsIERhdGFLaW5kcyAjLX0KCmltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCmltcG9ydCBEYXRhLlRyYXZlcnNhYmxlIChUcmF2ZXJzYWJsZSkKCmNsYXNzIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSBmKSA9PiBEaW0gZgoKZGF0YSBTaGFwZWx5IChmcyA6OiBbKiAtPiAqXSkgd2hlcmUKCVNoWiA6OiBTaGFwZWx5ICdbXQoJU2hTIDo6IChEaW0gZiwgU1NoYXBlbHkgZnMpID0+IFNoYXBlbHkgKGYgJzogZnMpCgpjbGFzcyBTU2hhcGVseSAoZnMgOjogWyogLT4gKl0pIHdoZXJlCglzaGFwZWx5IDo6IFNoYXBlbHkgZnMKCmluc3RhbmNlIFNTaGFwZWx5ICdbXSB3aGVyZQoJc2hhcGVseSA9IFNoWgoJCmluc3RhbmNlIChEaW0gZiwgU1NoYXBlbHkgZnMpID0+IFNTaGFwZWx5IChmICc6IGZzKSB3aGVyZQoJc2hhcGVseSA9IFNoUwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLSAgICAgICAgICAgIEh5cGVyY3Vib2lkIGRhdGF0eXBlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGF0YSBIeXBlciA6OiBbKiAtPiAqXSAtPiAqIC0+ICogd2hlcmUKICAgIFNjYWxhciA6OiBhIC0+IEh5cGVyICdbXSBhCiAgICBQcmlzbSAgOjogKERpbSBmLCBTU2hhcGVseSBmcykgPT4gCiAgICAgICAgICAgICAgICBIeXBlciBmcyAoZiBhKSAtPiBIeXBlciAoZiAnOiBmcykgYQoKaW5zdGFuY2UgRnVuY3RvciAoSHlwZXIgZnMpIHdoZXJlCiAgICBmbWFwIGYgKFNjYWxhciBhKSA9IFNjYWxhciAkIGYgYQogICAgZm1hcCBmIChQcmlzbSBwKSAgPSBQcmlzbSAkIGZtYXAgKGZtYXAgZikgcAoKcHVyZVNoIDo6IFNoYXBlbHkgZnMgLT4gYSAtPiBIeXBlciBmcyBhCnB1cmVTaCBTaFogeCA9IFNjYWxhciB4CnB1cmVTaCBTaFMgeCA9IFByaXNtIChwdXJlU2ggc2hhcGVseSAocHVyZSB4KSkKCmluc3RhbmNlIFNTaGFwZWx5IGZzID0+IEFwcGxpY2F0aXZlIChIeXBlciBmcykgd2hlcmUKCXB1cmUgPSBwdXJlU2ggc2hhcGVseQoKbWFpbiA9IHByaW50IDQy