Safe Haskell | None |
---|---|
Language | Haskell2010 |
safe-typed n-dimensional arrays
- newtype Array r a = Array (Vector a)
- data SomeArray a = SomeArray [Int] (Vector a)
- row :: forall i a m n. (KnownNat m, KnownNat n, KnownNat i, (i :< m) ~ True) => Proxy i -> Array '[m, n] a -> Array '[n] a
- col :: forall j a m n. (KnownNat m, KnownNat n, KnownNat j, (j :< n) ~ True) => Proxy j -> Array '[m, n] a -> Array '[m] a
- unsafeRow :: forall a m n. (KnownNat m, KnownNat n) => Int -> Array '[m, n] a -> Array '[n] a
- unsafeCol :: forall a m n. (KnownNat m, KnownNat n) => Int -> Array '[m, n] a -> Array '[m] a
- slice :: forall s r a. (SingI s, SingI r, And (ZipWith AllLTSym0 s r) ~ True) => Proxy s -> Array r a -> Array (Slice s) a
- unsafeSlice :: SingI r => [[Int]] -> Array r a -> Array r0 a
- index :: Representable f => forall a. f a -> Rep f -> a
- unsafeIndex :: SingI r => Array r a -> [Int] -> a
- foldAlong :: forall s vw uvw uw w a. (SingI s, SingI uvw, uw ~ Fold s uvw, w ~ Drop 1 vw, vw ~ TailModule s uvw) => Proxy s -> (Array vw a -> Array w a) -> Array uvw a -> Array uw a
- mapAlong :: forall s uvw vw a. (SingI s, SingI uvw, vw ~ HeadModule s uvw) => Proxy s -> (Array vw a -> Array vw a) -> Array uvw a -> Array uvw a
- concatenate :: forall s r t a. (SingI s, SingI r, SingI t, IsValidConcat s t r ~ True) => Proxy s -> Array r a -> Array t a -> Array (Concatenate s t r) a
- zipWith :: (a -> a -> a) -> Array s a -> Array s a -> Array s a
- transpose :: forall s t a. t ~ Transpose s => Array s a -> Array t a
- squeeze :: forall s t a. t ~ Squeeze s => Array s a -> Array t a
- (><) :: forall r s a. (CRing a, SingI r, SingI s, SingI (r :++ s)) => Array r a -> Array s a -> Array (r :++ s) a
- mmult :: forall m n k a. (Semiring a, Num a, CRing a, KnownNat m, KnownNat n, KnownNat k) => Array '[m, k] a -> Array '[k, n] a -> Array '[m, n] a
- fromList :: IsList l => [Item l] -> l
Documentation
an n-dimensional array where shape is specified at the type level The main purpose of this, beyond safe typing, is to supply the Representable instance with an initial object.
>>>
a
[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]]
an n-dimensional array where shape is specified at the value level
row :: forall i a m n. (KnownNat m, KnownNat n, KnownNat i, (i :< m) ~ True) => Proxy i -> Array '[m, n] a -> Array '[n] a Source #
extract the row of a matrix
col :: forall j a m n. (KnownNat m, KnownNat n, KnownNat j, (j :< n) ~ True) => Proxy j -> Array '[m, n] a -> Array '[m] a Source #
extract the column of a matrix
unsafeRow :: forall a m n. (KnownNat m, KnownNat n) => Int -> Array '[m, n] a -> Array '[n] a Source #
unsafeCol :: forall a m n. (KnownNat m, KnownNat n) => Int -> Array '[m, n] a -> Array '[m] a Source #
slice :: forall s r a. (SingI s, SingI r, And (ZipWith AllLTSym0 s r) ~ True) => Proxy s -> Array r a -> Array (Slice s) a Source #
>>>
slice (Proxy :: Proxy '[ '[0,1],'[2],'[1,2]]) a
[[[10, 11]], [[22, 23]]]
unsafeSlice :: SingI r => [[Int]] -> Array r a -> Array r0 a Source #
>>>
unsafeSlice [[0,1],[2],[1,2]] a :: Array '[2,1,2] Int
[[[10, 11]], [[22, 23]]]
index :: Representable f => forall a. f a -> Rep f -> a #
foldAlong :: forall s vw uvw uw w a. (SingI s, SingI uvw, uw ~ Fold s uvw, w ~ Drop 1 vw, vw ~ TailModule s uvw) => Proxy s -> (Array vw a -> Array w a) -> Array uvw a -> Array uw a Source #
>>>
foldAlong (Proxy :: Proxy 1) (\_ -> ([0..3] :: Array '[4] Int)) a
[[0, 1, 2, 3], [0, 1, 2, 3]]
todo: resolution of a primitive and a scalar eg Expected type: Array '[10] Int -> Array '[] Int Actual type: Array '[10] (Array '[] Int) -> Array '[] Int
mapAlong :: forall s uvw vw a. (SingI s, SingI uvw, vw ~ HeadModule s uvw) => Proxy s -> (Array vw a -> Array vw a) -> Array uvw a -> Array uvw a Source #
>>>
mapAlong (Proxy :: Proxy 0) (\x -> NumHask.Array.zipWith (*) x x) a
[[[1, 4, 9, 16], [25, 36, 49, 64], [81, 100, 121, 144]], [[169, 196, 225, 256], [289, 324, 361, 400], [441, 484, 529, 576]]]
concatenate :: forall s r t a. (SingI s, SingI r, SingI t, IsValidConcat s t r ~ True) => Proxy s -> Array r a -> Array t a -> Array (Concatenate s t r) a Source #
>>>
concatenate (Proxy :: Proxy 2) a a
[[[1, 2, 3, 4, 1, 2, 3, 4], [5, 6, 7, 8, 5, 6, 7, 8], [9, 10, 11, 12, 9, 10, 11, 12]], [[13, 14, 15, 16, 13, 14, 15, 16], [17, 18, 19, 20, 17, 18, 19, 20], [21, 22, 23, 24, 21, 22, 23, 24]]]
transpose :: forall s t a. t ~ Transpose s => Array s a -> Array t a Source #
>>>
NumHask.Array.transpose a
[[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]], [[13, 14], [15, 16], [17, 18]], [[19, 20], [21, 22], [23, 24]]]
squeeze :: forall s t a. t ~ Squeeze s => Array s a -> Array t a Source #
>>>
let a = [1..24] :: Array '[2,1,3,4,1] Int
>>>
a
[[[[[1], [2], [3], [4]], [[5], [6], [7], [8]], [[9], [10], [11], [12]]]], [[[[13], [14], [15], [16]], [[17], [18], [19], [20]], [[21], [22], [23], [24]]]]]>>>
squeeze a
[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]]
(><) :: forall r s a. (CRing a, SingI r, SingI s, SingI (r :++ s)) => Array r a -> Array s a -> Array (r :++ s) a Source #
outer product
todo: reconcile with numhask version
>>>
v >< v
[[1, 2, 3], [2, 4, 6], [3, 6, 9]]
mmult :: forall m n k a. (Semiring a, Num a, CRing a, KnownNat m, KnownNat n, KnownNat k) => Array '[m, k] a -> Array '[k, n] a -> Array '[m, n] a Source #
matrix multiplication for a '2-Array'
>>>
let a = [1, 2, 3, 4] :: Array '[2, 2] Int
>>>
let b = [5, 6, 7, 8] :: Array '[2, 2] Int
>>>
a
[[1, 2], [3, 4]]>>>
b
[[5, 6], [7, 8]]>>>
mmult a b
[[19, 22], [43, 50]]