dunai-core-0.5.1.0: src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
-- | 'VectorSpace' instances for 'MSF's that produce vector spaces. This allows
-- you to use vector operators with 'MSF's that output vectors, for example, you
-- can write:
--
-- @
-- msf1 :: MSF Input (Double, Double) -- defined however you want
-- msf2 :: MSF Input (Double, Double) -- defined however you want
-- msf3 :: MSF Input (Double, Double)
-- msf3 = msf1 ^+^ msf2
-- @
--
-- instead of
--
-- @
-- msf3 = (msf1 &&& msf2) >>> arr (uncurry (^+^))
-- @
--
--
-- Instances are provided for the type classes 'RModule' and 'VectorSpace'.
module Data.MonadicStreamFunction.Instances.VectorSpace where
import Control.Arrow
import Control.Arrow.Util
import Data.MonadicStreamFunction.Core
import Data.VectorSpace
-- These conflict with Data.VectorSpace.Instances
-- | R-module instance for 'MSF's.
instance (Monad m, RModule v) => RModule (MSF m a v) where
type Groundring (MSF m a v) = Groundring v
zeroVector = constantly zeroVector
r *^ msf = msf >>^ (r *^)
negateVector = (>>^ negateVector)
(^+^) = elementwise2 (^+^)
(^-^) = elementwise2 (^-^)
-- | Vector-space instance for 'MSF's.
instance (Monad m, VectorSpace v) => VectorSpace (MSF m a v) where
msf ^/ r = msf >>^ (^/ r)