因子分析的简单定义

时间:2018-01-05 12:24:31

标签: haskell category-theory

我正在阅读Bartosz Milewski关于Products and Coproducts的伟大帖子。

考虑以下功能:

factorizer :: (c -> a) -> (c -> b) -> (c -> (a, b))
factorizer p q = \x -> (p x, q x)

(c -> (a, b))是因果分解者吗?如果是,为什么?老实说,对我来说,样本只是一个函数,它需要两个更高阶的函数。我看不到Product的模式。

下一个样本:

factorizer :: (a -> c) -> (b -> c) -> Either a b -> c
factorizer i j (Left a)  = i a
factorizer i j (Right b) = j b

如何识别与上述代码对应的Coproducts模式?

1 个答案:

答案 0 :(得分:7)

在这两种情况下,factorizer都是分解因素。来自博客文章:

  

从两个候选者产生分解函数m的(高阶)函数有时被称为分解因子。

模式是在这两种情况下,这些函数只为某些方程提供 解决方案。

对于产品,对于每个fgfactorizer f gfst . factorizer f g = fsnd . factorizer f g = g唯一的功能。

对于副产品,对于每个fgfactorizer f gfactorizer f g . Left = ffactorizer f g . Right = g唯一的功能。

因子分解的存在表征Either(,)类型直到同构。这提供了另一种描述产品和总和的方法,可以推广到其他类别(它只是关于态射的组合)。相比之下,data (,) a b = (,) a bdata Either a b = Left a | Right b的定义是特定语言的特定定义。