我正在阅读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的(高阶)函数有时称为分解器。
模式是在这两种情况下,这些函数都是某些方程式的唯一解决方案。
对于产品,对于每个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
的定义是特定语言的特别设置。