我正在阅读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模式?

最佳答案

在这两种情况下,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的定义是特定语言的特别设置。

10-08 12:41