我正在阅读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
模式?
答案 0 :(得分:7)
在这两种情况下,factorizer
都是分解因素。来自博客文章:
从两个候选者产生分解函数m的(高阶)函数有时被称为分解因子。
模式是在这两种情况下,这些函数只为某些方程提供 解决方案。
对于产品,对于每个f
和g
,factorizer f g
是fst . factorizer f g = f
和snd . factorizer f g = g
唯一的功能。
对于副产品,对于每个f
和g
,factorizer f g
是factorizer f g . Left = f
和factorizer f g . Right = g
唯一的功能。
因子分解的存在表征Either
和(,)
类型直到同构。这提供了另一种描述产品和总和的方法,可以推广到其他类别(它只是关于态射的组合)。相比之下,data (,) a b = (,) a b
和data Either a b = Left a | Right b
的定义是特定语言的特定定义。