代码之家  ›  专栏  ›  技术社区  ›  softshipper

分解器的简单定义

  •  3
  • softshipper  · 技术社区  · 7 年前

    我正在阅读BartoszMilewski关于 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 回复  |  直到 7 年前
        1
  •  7
  •   Li-yao Xia    7 年前

    在这两种情况下, factorizer 是分解器。从博客帖子:

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

    模式是,在这两种情况下,这些函数都给出 只有 某些方程的解。

    对于产品,对于每个 f g , factorizer f g 唯一的功能是 fst . factorizer f g = f snd . factorizer f g = g .

    对于副产品 f g级 , 因子分解器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 是特定语言的专用语言。