Arrays 矩阵作为应用函子,它不是单子

Arrays 矩阵作为应用函子,它不是单子,arrays,scala,monads,applicative,category-theory,Arrays,Scala,Monads,Applicative,Category Theory,我遇到了许多不是单子的应用程序。我喜欢多维数组示例,但我没有完全理解它 让我们看一个矩阵M[a]。你能证明M[A]是一个Applicative而不是带有Scala代码的Monad吗?您是否有任何将矩阵用作应用程序的“真实”示例?类似M[T]M[T=>U]的应用程序: val A = [[1,2],[1,2]] //let's assume such imaginary syntax for arrays val B = [[*2, *3], [*5, *2]] A <*> B ==

我遇到了许多不是单子的应用程序。我喜欢多维数组示例,但我没有完全理解它

让我们看一个矩阵
M[a]
。你能证明
M[A]
是一个
Applicative
而不是带有Scala代码的
Monad
吗?您是否有任何将矩阵用作
应用程序的“真实”示例?

类似
M[T]M[T=>U]
的应用程序:

val A = [[1,2],[1,2]] //let's assume such imaginary syntax for arrays
val B = [[*2, *3], [*5, *2]]

A <*> B === [[2,6],[5,4]]
标识元素将是
[]

因此,您还可以构建monad(再次生成伪代码):


不幸的是,T必须有零元素(或任何默认值)(不仅仅是monoid本身)。它不会使t本身成为某种岩浆(因为不需要为这个集合定义二进制操作-只需要为t定义一些
const
),但可能会产生额外的问题(取决于您的挑战)。

您如何为矩阵定义
flatMap
?证明某些东西是不可能的有点困难。证明定义不满足单子定律会更容易。:)除非用Scala.Sure编写定理证明程序,否则不能用Scala代码显示这些内容。这就像每个维度中的列表一样。想象一个写在白板上的矩形阵列,比如5x6个东西,周围有一个边框。现在想象这样一个矩形阵列,比如说一个7x8的,写在白板上的矩形阵列。现在擦拭内部边界。最终得到一个(5*7)x(6*8)的矩形数组。这是您的
展平
flatMap
只是
map
flatMap
的组合,所以它很简单。不,等等,这不正确。我假设所有的内部矩阵都是相同大小的,当然这不一定是真的。我真丢脸。
val A = [[11,12],[21,22]]; val B = [[11,12,13],[21,22,23],[31,32,33]]
A + B === [[11,12,0,0,0], [21,22,0,0,0], [0,0,11,12,13],[0,0,21,22,23],[0,0,31,32,33]
def flatMap[T, U](a: M[T])(f: T => M[U]) = {
    val mapped = a.map(f)// M[M[U]] // map
    def normalize(xn: Int, yn: Int) = ... // complete matrix with zeros to strict xn * yn size
    a.map(normalize(a.max(_.xn), a.max(_.yn)))
     .reduceHorizontal(_ concat _)
     .reduceVertical(_ concat _) // flatten
}

val res = flatMap([[1,1],[2,1]], x => if(x == 1)[[2,2]] else [[3,3,3]])

res === [[2,2,0,2,2],[3,3,3,2,2]]