{-# LANGUAGE KindSignatures, GADTs, TypeFamilies, TypeOperators, MultiParamTypeClasses, DataKinds #-}
import Control.Applicative
import Data.Traversable (Traversable)
class (Applicative f, Traversable f) => Dim f
class Shapely (fs :: [* -> *])
instance Shapely '[]
instance (Dim f, Shapely fs) => Shapely (f ': fs)
-------------------------------------
-- Hypercuboid datatype
-------------------------------------
data Hyper :: [* -> *] -> * -> * where
Scalar :: a -> Hyper '[] a
Prism :: (Dim f, Shapely fs) =>
Hyper fs (f a) -> Hyper (f ': fs) a
fmap f
(Scalar a
) = Scalar
$ f a
instance Applicative (Hyper fs) where
{- `pure a = Scalar a` gives:
Couldn't match type ‘fs’ with ‘'[]’
‘fs’ is a rigid type variable bound by
the instance declaration
Expected type: Hyper fs a
Actual type: Hyper '[] a
-}
ey0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzLCBHQURUcywgVHlwZUZhbWlsaWVzLCBUeXBlT3BlcmF0b3JzLCBNdWx0aVBhcmFtVHlwZUNsYXNzZXMsIERhdGFLaW5kcyAjLX0KCmltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlCmltcG9ydCBEYXRhLlRyYXZlcnNhYmxlIChUcmF2ZXJzYWJsZSkKCmNsYXNzIChBcHBsaWNhdGl2ZSBmLCBUcmF2ZXJzYWJsZSBmKSA9PiBEaW0gZgoKY2xhc3MgU2hhcGVseSAoZnMgOjogWyogLT4gKl0pCmluc3RhbmNlIFNoYXBlbHkgJ1tdCmluc3RhbmNlIChEaW0gZiwgU2hhcGVseSBmcykgPT4gU2hhcGVseSAoZiAnOiBmcykKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS0gICAgICAgICAgICBIeXBlcmN1Ym9pZCBkYXRhdHlwZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRhdGEgSHlwZXIgOjogWyogLT4gKl0gLT4gKiAtPiAqIHdoZXJlCiAgICBTY2FsYXIgOjogYSAtPiBIeXBlciAnW10gYQogICAgUHJpc20gIDo6IChEaW0gZiwgU2hhcGVseSBmcykgPT4gCiAgICAgICAgICAgICAgICBIeXBlciBmcyAoZiBhKSAtPiBIeXBlciAoZiAnOiBmcykgYQoKaW5zdGFuY2UgRnVuY3RvciAoSHlwZXIgZnMpIHdoZXJlCiAgICBmbWFwIGYgKFNjYWxhciBhKSA9IFNjYWxhciAkIGYgYQogICAgZm1hcCBmIChQcmlzbSBwKSAgPSBQcmlzbSAkIGZtYXAgKGZtYXAgZikgcAoKaW5zdGFuY2UgQXBwbGljYXRpdmUgKEh5cGVyIGZzKSB3aGVyZQogICAgcHVyZSBhID0gdW5kZWZpbmVkIAp7LSBgcHVyZSBhID0gU2NhbGFyIGFgIGdpdmVzOgogICAgICAgICAgICBDb3VsZG4ndCBtYXRjaCB0eXBlIOKAmGZz4oCZIHdpdGgg4oCYJ1td4oCZCiAgICAgICAgICAgICAgICAgIOKAmGZz4oCZIGlzIGEgcmlnaWQgdHlwZSB2YXJpYWJsZSBib3VuZCBieQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBkZWNsYXJhdGlvbgogICAgICAgICAgICBFeHBlY3RlZCB0eXBlOiBIeXBlciBmcyBhCiAgICAgICAgICAgICAgQWN0dWFsIHR5cGU6IEh5cGVyICdbXSBhCi19CgptYWluID0gcHJpbnQgNDI=