{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -Wall #-}

-- | numbers with a shape
module NumHask.Shape
  ( HasShape(..)
    -- * Representable
    -- | Representable has most of what's needed to define numbers that have elements (aka scalars) and a fixed shape.
  , Representable(..)
  )
where

import Data.Functor.Rep

-- | Not everything that has a shape is representable.
--
-- todo: Structure is a useful alternative concept/naming convention
class HasShape f where
  type Shape f
  shape :: f a -> Shape f