Îõ³h*]YBº      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹0.11.1.0 Safe-Inferred.1Û · numhask-arrayReflect a list of list of Nats numhask-arrayReflect a list of Nats( numhask-array™The Shape type holds a [Nat] at type level and the equivalent [Int] at value level. Using [Int] as the index for an array nicely represents the practical interests and constraints downstream of this high-level API: densely-packed numbers (reals or integrals), indexed and layered.+ numhask-arrayNumber of dimensions, numhask-array&The shape of a list of element indexes- numhask-arrayNumber of elements. numhask-array.convert from n-dim shape index to a flat indexflatten [2,3,4] [1,1,1]17flatten [] [1,1,1]0/ numhask-array*convert from a flat index to a shape indexshapen [2,3,4] 17[1,1,1]0 numhask-arraycheckIndex i n checks if i& is a valid index of a list of length n1 numhask-arraycheckIndexes is n check if is' are valid indexes of a list of length n2 numhask-array,dimension i is the i'th dimension of a Shape3 numhask-arrayminimum value in a list4 numhask-array$drop the i'th dimension from a shapedropIndex [2, 3, 4] 1[2,4]5 numhask-arrayaddIndex s i d adds a new dimension to shape s at position iaddIndex [2,4] 1 3[2,3,4]6 numhask-array´convert a list of position that references a final shape to one that references positions relative to an accumulator. Deletions are from the left and additions are from the right. deletionsposRelative [0,1][0,0] additions%reverse (posRelative (reverse [1,0]))[0,0]7 numhask-arrayèdrop dimensions of a shape according to a list of positions (where position refers to the initial shape)dropIndexes [2, 3, 4] [1, 0][4]8 numhask-arrayinsert a list of dimensions according to position and dimension lists. Note that the list of positions references the final shape and not the initial shape.addIndexes [4] [1,0] [3,2][2,3,4]9 numhask-array4take list of dimensions according to position lists.takeIndexes [2,3,4] [2,0][4,2]: numhask-arrayÔturn a list of included positions for a given rank into a list of excluded positionsexclude 3 [1,2][0]; numhask-array concatenateconcatenate' 1 [2,3,4] [2,3,4][2,6,4]< numhask-array incAt d s increments the index at d of shape s by one.= numhask-array decAt d s decrements the index at d of shape s by one.> numhask-array reorder' s i" reorders the dimensions of shape s" according to a list of positions ireorder' [2,3,4] [2,0,1][4,2,3]? numhask-arrayremove 1's from a listÀ()*&'+%,$-#2 ./30"1!546879:  ;  >?<=À()*&'+%,$-#2 ./30"1!546879:  ;  >?<= Safe-Inferred.1Û-0&G numhask-array1a multidimensional array with a value-level shape1let a = fromFlatList [2,3,4] [1..24] :: Array Inta[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]]K numhask-arrayconvert from a list!fromFlatList [2,3,4] [1..24] == aTrueL numhask-arrayconvert to a flat list.toFlatList a == [1..24]TrueM numhask-arrayextract an element at index iindex a [1,2,3]24N numhask-array,tabulate an array with a generating function.tabulate [2,3,4] ((1+) . flatten [2,3,4]) == aTrueO numhask-array;Takes the top-most elements according to the new dimension.takes [2,2,3] a [[[1, 2, 3], [5, 6, 7]], [[13, 14, 15], [17, 18, 19]]]P numhask-array4Reshape an array (with the same number of elements).reshape [4,3,2] 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]]]Q numhask-array+Reverse indices eg transposes the element Aijk to Akji..index (transpose a) [1,0,0] == index a [0,0,1]TrueR numhask-arrayIndices of an Array. indices [3,3][[[0,0], [0,1], [0,2]], [[1,0], [1,1], [1,2]], [[2,0], [2,1], [2,2]]]S numhask-arrayThe identity array. ident [3,2][[1, 0], [0, 1], [0, 0]]T numhask-arrayAn array of sequential Ints sequent [3] [0, 1, 2] sequent [3,3] [[0, 0, 0], [0, 1, 0], [0, 0, 2]]U numhask-array!Extract the diagonal of an array.diag (ident [3,2])[1, 1]V numhask-array)Expand the array to form a diagonal array!undiag 2 (fromFlatList [2] [1,1])[[1, 0], [0, 1]]W numhask-array+Create an array composed of a single value.singleton [3,2] one[[1, 1], [1, 1], [1, 1]]X numhask-array!Select an array along dimensions.let s = selects [0,1] [1,1] as[17, 18, 19, 20]Y numhask-arraySelect an index except along specified dimensions!let s = selectsExcept [2] [1,1] as[17, 18, 19, 20]Z numhask-array Fold along specified dimensions.folds sum [1] a[68, 100, 132][ numhask-array&Extracts dimensions to an outer layer.let e = extracts [1,2] ashape <$> extracts [0] a[[3,4], [3,4]]\ numhask-array Extracts except dimensions to an outer layer.let e = extractsExcept [1,2] ashape <$> extracts [0] a[[3,4], [3,4]]] numhask-array&Join inner and outer dimension layers.let e = extracts [1,0] alet j = joins [1,0] ea == jTrue^ numhask-array+Maps a function along specified dimensions.shape $ maps (transpose) [1] a[4,3,2]_ numhask-arrayConcatenate along a dimension.shape $ concatenate 1 a a[2,6,4]` numhask-array'Insert along a dimension at a position.,insert 2 0 a (fromFlatList [2,3] [100..105])[[[100, 1, 2, 3, 4], [101, 5, 6, 7, 8], [102, 9, 10, 11, 12]], [[103, 13, 14, 15, 16], [104, 17, 18, 19, 20], [105, 21, 22, 23, 24]]]a numhask-array$Insert along a dimension at the end.*append 2 a (fromFlatList [2,3] [100..105])[[[1, 2, 3, 4, 100], [5, 6, 7, 8, 101], [9, 10, 11, 12, 102]], [[13, 14, 15, 16, 103], [17, 18, 19, 20, 104], [21, 22, 23, 24, 105]]]b numhask-arraychange the order of dimensionslet r = reorder [2,0,1] ar [[[1, 5, 9], [13, 17, 21]], [[2, 6, 10], [14, 18, 22]], [[3, 7, 11], [15, 19, 23]], [[4, 8, 12], [16, 20, 24]]]c numhask-array6Product two arrays using the supplied binary function.øFor context, if the function is multiply, and the arrays are tensors, then this can be interpreted as a tensor product. ,https://en.wikipedia.org/wiki/Tensor_productÇThe concept of a tensor product is a dense crossroad, and a complete treatment is elsewhere. To quote: ... the tensor product can be extended to other categories of mathematical objects in addition to vector spaces, such as to matrices, tensors, algebras, topological vector spaces, and modules. In each such case the tensor product is characterized by a similar universal property: it is the freest bilinear operation. The general concept of a "tensor product" is captured by monoidal categories; that is, the class of all things that have a tensor product is a monoidal category.expand (*) v v [[1, 2, 3], [2, 4, 6], [3, 6, 9]]ŽAlternatively, expand can be understood as representing the permutation of element pairs of two arrays, so like the Applicative List instance.i2 = indices [2,2]expand (,) i2 i2"[[[[([0,0],[0,0]), ([0,0],[0,1])],# [([0,0],[1,0]), ([0,0],[1,1])]]," [[([0,1],[0,0]), ([0,1],[0,1])],$ [([0,1],[1,0]), ([0,1],[1,1])]]]," [[[([1,0],[0,0]), ([1,0],[0,1])],# [([1,0],[1,0]), ([1,0],[1,1])]]," [[([1,1],[0,0]), ([1,1],[0,1])],$ [([1,1],[1,0]), ([1,1],[1,1])]]]]d numhask-arrayÈLike expand, but permutes the first array first, rather than the second.expand (,) v (fmap (+3) v)[[(1,4), (1,5), (1,6)], [(2,4), (2,5), (2,6)], [(3,4), (3,5), (3,6)]]expandr (,) v (fmap (+3) v)[[(1,4), (2,4), (3,4)], [(1,5), (2,5), (3,5)], [(1,6), (2,6), (3,6)]]e numhask-array4Apply an array of functions to each array of values.ÁThis is in the spirit of the applicative functor operation (<*>). "expand f a b == apply (fmap f a) bapply ((*) <$> v) v [[1, 2, 3], [2, 4, 6], [3, 6, 9]]9Dynamic arrays can't be Applicatives because there is no º& (Shape is not known at compile-time)..let b = fromFlatList [2,3] [1..6] :: Array Int5contract sum [1,2] (apply (fmap (*) b) (transpose b)) [[14, 32], [32, 77]]f numhask-arrayåContract an array by applying the supplied (folding) function on diagonal elements of the dimensions.£This generalises a tensor contraction by allowing the number of contracting diagonals to be other than 2, and allowing a binary operator other than multiplication..let b = fromFlatList [2,3] [1..6] :: Array Int/contract sum [1,2] (expand (*) b (transpose b)) [[14, 32], [32, 77]]g numhask-array‹A generalisation of a dot operation, which is a multiplicative expansion of two arrays and sum contraction along the middle two dimensions.matrix multiplication.let b = fromFlatList [2,3] [1..6] :: Array Intdot sum (*) b (transpose b) [[14, 32], [32, 77]] inner product,let v = fromFlatList [3] [1..3] :: Array Intdot sum (*) v v14ñmatrix-vector multiplication Note that an `Array Int` with shape [3] is neither a row vector nor column vector. gÎ is not turning the vector into a matrix and then using matrix multiplication.dot sum (*) v b [9, 12, 15]dot sum (*) b v[14, 32]h numhask-arrayArray multiplication.matrix multiplication.let b = fromFlatList [2,3] [1..6] :: Array Intmult b (transpose b) [[14, 32], [32, 77]] inner product,let v = fromFlatList [3] [1..3] :: Array Intmult v v14matrix-vector multiplicationmult v b [9, 12, 15]mult b v[14, 32]i numhask-array3Select elements along positions in every dimension.#let s = slice [[0,1],[0,2],[1,2]] as [[[2, 3], [10, 11]], [[14, 15], [22, 23]]]j numhask-arrayRemove single dimensions.6let a' = fromFlatList [2,1,3,4,1] [1..24] :: Array Intshape $ squeeze a'[2,3,4]k numhask-array8Unwrapping scalars is probably a performance bottleneck.(let s = fromFlatList [] [3] :: Array Int fromScalar s3l numhask-arrayConvert a number to a scalar. :t toScalar 2&toScalar 2 :: FromInteger a => Array am numhask-array Extract specialised to a matrix.row 1 m [4, 5, 6, 7]n numhask-arrayextract specialised to a matrixcol 1 m [1, 5, 9]o numhask-arraymatrix multiplication+This is dot sum (*) specialised to matrices4let a = fromFlatList [2,2] [1, 2, 3, 4] :: Array Int4let b = fromFlatList [2,2] [5, 6, 7, 8] :: Array Inta[[1, 2], [3, 4]]b[[5, 6], [7, 8]] mmult a b [[19, 22], [43, 50]])GHJIKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklnmo)GHJIKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklnmo Safe-Inferred.1ÛWÞ,w numhask-array 2https://en.wikipedia.org/wiki/Matrix_(mathematics) Wiki Matrixx numhask-array >https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics) Wiki Vectory numhask-array0a multidimensional array with a type-level shape:set -XDataKinds[1..24] :: Array '[2,3,4] Int[[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]][1,2,3] :: Array '[2,2] IntÁ*** Exception: NumHaskException {errorMessage = "shape mismatch"}[[| numhask-array!Get shape of an Array as a value.shape a[2,3,4]} numhask-array9convert to a dynamic array with shape at the value level.~ numhask-array'Use a dynamic array in a fixed context.+import qualified NumHask.Array.Dynamic as Dõwith (D.fromFlatList [2,3,4] [1..24]) (selects (Proxy :: Proxy '[0,1]) [1,1] :: Array '[2,3,4] Int -> Array '[4] Int)[17, 18, 19, 20] numhask-array;Takes the top-most elements according to the new dimension.takes a :: Array '[2,2,3] Int [[[1, 2, 3], [5, 6, 7]], [[13, 14, 15], [17, 18, 19]]]€ numhask-array4Reshape an array (with the same number of elements).reshape a :: Array '[4,3,2] Int [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]], [[13, 14], [15, 16], [17, 18]], [[19, 20], [21, 22], [23, 24]]] numhask-array+Reverse indices eg transposes the element Aijk to Akji..index (transpose a) [1,0,0] == index a [0,0,1]True‚ numhask-arrayIndices of an Array.indices :: Array '[3,3] [Int][[[0,0], [0,1], [0,2]], [[1,0], [1,1], [1,2]], [[2,0], [2,1], [2,2]]]ƒ numhask-arrayThe identity array.ident :: Array '[3,2] Int[[1, 0], [0, 1], [0, 0]]„ numhask-arrayAn array of sequential Intssequent :: Array '[3] Int [0, 1, 2]sequent :: Array '[3,3] Int [[0, 0, 0], [0, 1, 0], [0, 0, 2]]… numhask-array!Extract the diagonal of an array. diag (ident :: Array '[3,2] Int)[1, 1]† numhask-array)Expand the array to form a diagonal array undiag ([1,1] :: Array '[2] Int)[[1, 0], [0, 1]]‡ numhask-array+Create an array composed of a single value.!singleton one :: Array '[3,2] Int[[1, 1], [1, 1], [1, 1]]ˆ numhask-array!Select an array along dimensions./let s = selects (Proxy :: Proxy '[0,1]) [1,1] a:t ss :: Array '[4] Ints[17, 18, 19, 20]‰ numhask-arraySelect an index except along specified dimensions.3let s = selectsExcept (Proxy :: Proxy '[2]) [1,1] a:t ss :: Array '[4] Ints[17, 18, 19, 20]Š numhask-array Fold along specified dimensions.!folds sum (Proxy :: Proxy '[1]) a[68, 100, 132]‹ numhask-array&Extracts dimensions to an outer layer.*let e = extracts (Proxy :: Proxy '[1,2]) a:t e"e :: Array [3, 4] (Array '[2] Int)Œ numhask-array Extracts except dimensions to an outer layer.0let e = extractsExcept (Proxy :: Proxy '[1,2]) a:t e"e :: Array '[2] (Array [3, 4] Int) numhask-array&Join inner and outer dimension layers.*let e = extracts (Proxy :: Proxy '[1,0]) a:t e"e :: Array [3, 2] (Array '[4] Int)'let j = joins (Proxy :: Proxy '[1,0]) e:t jj :: Array [2, 3, 4] Inta == jTrueŽ numhask-array+Maps a function along specified dimensions.+:t maps (transpose) (Proxy :: Proxy '[1]) a?maps (transpose) (Proxy :: Proxy '[1]) a :: Array [4, 3, 2] Int numhask-arrayConcatenate along a dimension.%:t concatenate (Proxy :: Proxy 1) a a9concatenate (Proxy :: Proxy 1) a a :: Array [2, 6, 4] Int numhask-array'Insert along a dimension at a position.;insert (Proxy :: Proxy 2) (Proxy :: Proxy 0) a ([100..105])[[[100, 1, 2, 3, 4], [101, 5, 6, 7, 8], [102, 9, 10, 11, 12]], [[103, 13, 14, 15, 16], [104, 17, 18, 19, 20], [105, 21, 22, 23, 24]]]‘ numhask-array$Insert along a dimension at the end.:t append (Proxy :: Proxy 0) aappend (Proxy :: Proxy 0) a, :: Array [3, 4] Int -> Array [3, 3, 4] Int’ numhask-arrayChange the order of dimensions.+let r = reorder (Proxy :: Proxy '[2,0,1]) a:t rr :: Array [4, 2, 3] Int“ numhask-array6Product two arrays using the supplied binary function.øFor context, if the function is multiply, and the arrays are tensors, then this can be interpreted as a tensor product. ,https://en.wikipedia.org/wiki/Tensor_productçThe concept of a tensor product is a dense crossroad, and a complete treatment is elsewhere. To quote:Þ... the tensor product can be extended to other categories of mathematical objects in addition to vector spaces, such as to matrices, tensors, algebras, topological vector spaces, and modules. In each such case the tensor product is characterized by a similar universal property: it is the freest bilinear operation. The general concept of a "tensor product" is captured by monoidal categories; that is, the class of all things that have a tensor product is a monoidal category.expand (*) v v [[1, 2, 3], [2, 4, 6], [3, 6, 9]]ŽAlternatively, expand can be understood as representing the permutation of element pairs of two arrays, so like the Applicative List instance."i2 = indices :: Array '[2,2] [Int]expand (,) i2 i2"[[[[([0,0],[0,0]), ([0,0],[0,1])],# [([0,0],[1,0]), ([0,0],[1,1])]]," [[([0,1],[0,0]), ([0,1],[0,1])],$ [([0,1],[1,0]), ([0,1],[1,1])]]]," [[[([1,0],[0,0]), ([1,0],[0,1])],# [([1,0],[1,0]), ([1,0],[1,1])]]," [[([1,1],[0,0]), ([1,1],[0,1])],$ [([1,1],[1,0]), ([1,1],[1,1])]]]]” numhask-arrayÈLike expand, but permutes the first array first, rather than the second.expand (,) v (v |+ 3)[[(1,4), (1,5), (1,6)], [(2,4), (2,5), (2,6)], [(3,4), (3,5), (3,6)]]expandr (,) v (v |+ 3)[[(1,4), (2,4), (3,4)], [(1,5), (2,5), (3,5)], [(1,6), (2,6), (3,6)]]• numhask-array4Apply an array of functions to each array of values.ÁThis is in the spirit of the applicative functor operation (<*>). "expand f a b == apply (fmap f a) bapply ((*) <$> v) v [[1, 2, 3], [2, 4, 6], [3, 6, 9]]ãFixed Arrays can't be applicative functors because the changes in shape are reflected in the types. ¹:t apply apply :: (HasShape s, HasShape s', HasShape (s ++ s')) => Array s (a -> b) -> Array s' a -> Array (s ++ s') b :t (<*>) (<*>) :: Applicative f => f (a -> b) -> f a -> f b"let b = [1..6] :: Array '[2,3] IntÇcontract sum (Proxy :: Proxy '[1,2]) (apply (fmap (*) b) (transpose b)) [[14, 32], [32, 77]]– numhask-arrayåContract an array by applying the supplied (folding) function on diagonal elements of the dimensions.£This generalises a tensor contraction by allowing the number of contracting diagonals to be other than 2, and allowing a binary operator other than multiplication."let b = [1..6] :: Array '[2,3] IntÁcontract sum (Proxy :: Proxy '[1,2]) (expand (*) b (transpose b)) [[14, 32], [32, 77]]— numhask-array‹A generalisation of a dot operation, which is a multiplicative expansion of two arrays and sum contraction along the middle two dimensions.matrix multiplication"let b = [1..6] :: Array '[2,3] Intdot sum (*) b (transpose b) [[14, 32], [32, 77]] inner product let v = [1..3] :: Array '[3] Int:t dot sum (*) v v dot sum (*) v v :: Array '[] Intdot sum (*) v v14êmatrix-vector multiplication (Note how the vector doesn't need to be converted to a row or column vector)dot sum (*) v b [9, 12, 15]dot sum (*) b v[14, 32](Array elements don't have to be numbers:-x1 = (show <$> [1..4]) :: Array '[2,2] String-x2 = (show <$> [5..8]) :: Array '[2,2] Stringx1 [["1", "2"], ["3", "4"]]x2 [["5", "6"], ["7", "8"]]import Data.List (intercalate) a <> "*" <> b) x1 x2[["1*5+2*7", "1*6+2*8"], ["3*5+4*7", "3*6+4*8"]]—õ allows operation on mis-shaped matrices. The algorithm ignores excess positions within the contracting dimension(s):$let m23 = [1..6] :: Array '[2,3] Int#let m12 = [1,2] :: Array '[1,2] Intshape $ dot sum (*) m23 m12[2,2]&Find instances of a vector in a matrix=let cs = fromList ("abacbaab" :: [Char]) :: Array '[4,2] Char2let v = fromList ("ab" :: [Char]) :: Vector 2 Chardot (all id) (==) cs v[True, False, False, True]˜ numhask-arrayArray multiplication.matrix multiplication"let b = [1..6] :: Array '[2,3] Intmult b (transpose b) [[14, 32], [32, 77]] inner product let v = [1..3] :: Array '[3] Int :t mult v vmult v v :: Array '[] Intmult v v14matrix-vector multiplicationmult v b [9, 12, 15]mult b v[14, 32]™ numhask-array3Select elements along positions in every dimension.5let s = slice (Proxy :: Proxy '[[0,1],[0,2],[1,2]]) a:t ss :: Array [2, 2, 2] Ints [[[2, 3], [10, 11]], [[14, 15], [22, 23]]]?let s = squeeze $ slice (Proxy :: Proxy '[ '[0], '[0], '[0]]) a:t ss :: Array '[] Ints1š numhask-arrayRemove single dimensions.)let a = [1..24] :: Array '[2,1,3,4,1] Inta[[[[[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]]]$squeeze ([1] :: Array '[1,1] Double)1.0› numhask-array8Unwrapping scalars is probably a performance bottleneck.'let s = [3] :: Array ('[] :: [Nat]) Int fromScalar s3œ numhask-arrayConvert a number to a scalar. :t toScalar 2*toScalar 2 :: FromInteger a => Array '[] a numhask-arrayVector specialisation of „ž numhask-array ìhttps://math.stackexchange.com/questions/1003801/inverse-of-an-invertible-upper-triangular-matrix-of-order-3Inverse of a triangular matrix.Ÿ numhask-arraycholesky decomposition Uses the  Ëhttps://en.wikipedia.org/wiki/Cholesky_decomposition#The_Cholesky_algorithmCholesky-Crout algorithm.  numhask-array Extract specialised to a matrix.row 1 m [4, 5, 6, 7]¡ numhask-array%Row extraction checked at type level.safeRow (Proxy :: Proxy 1) m [4, 5, 6, 7]safeRow (Proxy :: Proxy 3) m...... index outside range...¢ numhask-array Extract specialised to a matrix.col 1 m [1, 5, 9]£ numhask-array(Column extraction checked at type level.safeCol (Proxy :: Proxy 1) m [1, 5, 9]safeCol (Proxy :: Proxy 4) m...... index outside range...¤ numhask-arrayMatrix multiplication.+This is dot sum (*) specialised to matrices)let a = [1, 2, 3, 4] :: Array '[2, 2] Int)let b = [5, 6, 7, 8] :: Array '[2, 2] Inta[[1, 2], [3, 4]]b[[5, 6], [7, 8]] mmult a b [[19, 22], [43, 50]].yz{~|}€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œxw¢ £¡¤Ÿž.yz{~|}€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œxw¢ £¡¤Ÿž Safe-InferredXªî#()*&'%$ "!   3-.0+,2/1546879:;>?<=yz{xw•‚~‡š‘™€ƒ„…†ˆ‰Š‹ŒŽ’“”–—˜›œ¢ ¤|}£¡Ÿž»      !"#$%&'()*+,-../0123456789:;<=>?@ABCDEFGHIJKLLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|LLNM}~STUVWXYZ[\]^_`abcdefghijklmnop€q‚rƒs„…†‡ˆ‰Š‹ŒŽt‘xywvzu’“”•-numhask-array-0.11.1.0-6MT8dBAHivGJ6gRPSnmgkdNumHask.Array.ShapeNumHask.Array.DynamicNumHask.Array.Fixed numhask-array NumHask.Array KnownNatssnatValss KnownNatsnatValsFilterSqueeze CheckReorderReorderInsert CheckInsertCheckConcatenate ConcatenateExclude EnumerateGo Enumerate!! TakeIndexes AddIndexesGo AddIndexes DropIndexesGo DropIndexesDecMap PosRelativeGo PosRelative ReverseGoReverseAddIndex DropIndex++DropTakeMinimum Dimension CheckIndexes CheckIndexSizeRanksRankHasShapetoShapeShapeshapeValrankrankssizeflattenshapen checkIndex checkIndexes dimensionminimum dropIndexaddIndex posRelative dropIndexes addIndexes takeIndexesexclude concatenate'incAtdecAtreorder'squeeze' $fHasShape: $fHasShape[] $fKnownNats: $fKnownNats[] $fKnownNatss:$fKnownNatss[] $fShowShapeArrayshapeunArray fromFlatList toFlatListindextabulatetakesreshape transposeindicesidentsequentdiagundiag singletonselects selectsExceptfoldsextractsextractsExceptjoinsmaps concatenateinsertappendreorderexpandexpandrapplycontractdotmultslicesqueeze fromScalartoScalarrowcolmmult $fShowArray$fTraversableArray$fFoldableArray$fFunctorArray $fEqArray $fOrdArray$fGenericArrayMatrixVector toDynamicwithsequentvinvtricholsafeRowsafeCol $fIsListArray$fEpsilonArray$fMeetSemiLatticeArray$fJoinSemiLatticeArray$fDivisiveActionArray$fSubtractiveActionArray$fAdditiveActionArray$fMultiplicativeActionArray$fSubtractiveArray$fAdditiveArray$fRepresentableArray$fDistributiveArray$fDivisiveArray$fMultiplicativeArraybaseGHC.Basepure