【问题标题】:Function composition, Kleisli arrow, and Monadic laws函数组合、Kleisli 箭头和一元定律
【发布时间】:2014-02-01 15:21:29
【问题描述】:

阅读此article 后,我了解到>=>Kleisli 箭头)只是组合函数的高阶函数,它返回“一元值”。例如:

val f: A => M[B] = ... val g: B => M[C] = ... val h: A => M[C] = f >=> g // 用 Kleisli 箭头组合 f 和 g

它看起来像是“简单”函数(即返回简单值的纯函数)的简单组合:

val f: A => B = ... val g: B => C = ... val h = f 然后 g; // 合成 f 和 g

现在我猜这个“简单”的组合 andThen 符合某些法律

  • 身份f andThen g == gg andThen f == g 用于 身份 功能:f[A](a:A):A = a
  • 关联性(f1 andThen f2) andThen f3 == f1 andThen (f2 andThen f3)

现在我的问题是:

  • >=> 是否符合那些身份f(a:A) = M[a].unit(a) 的法律?
  • 我们能从这些定律中推导出一元定律吗?这些定律和一元定律是否等效?

【问题讨论】:

    标签: scala functional-programming monads kleisli


    【解决方案1】:

    你在这里看到的是这个构造的直接结果是category

    1. 是的,它们确实符合要求。并且它们符合确实是它们被称为 Kleisli 的原因,因为 Kleisli 箭头加类型形成了单子的 Kleisli category(每个单子都产生)。这也是为什么unit被这样称呼的原因:它是Kleisli箭头组成的单位。
    2. 是的,它们可以派生。使用转换(f <=< g) x = f =<< (g x)(其中<=<andThen=<< 可能类似于Scala 中的flip(bind))。推导的具体步骤可以在here找到。

    【讨论】:

    • 谢谢。 =<< 是 Scala 中的 flatMap
    • 顺便说一句,你能解释一下为什么身份法是重要的吗? 直观,但为什么很重要?如果我有一个不符合身份法的结构怎么办?会发生什么坏事?
    • 嗯,重点是类别的定义 要求在组合下拥有身份。如果你没有它们,就不会发生任何“坏事”,但结构不能称为类别。就像没有身份的“幺半群”只是不是一个幺半群,而是一个半群。我还将在答案中添加一个更容易介绍类别的链接。
    • 关于直觉的部分是,大多数这种直觉结构都是基于范畴论的。你会发现在数学中几乎无处不在的具有恒等式的可组合态射,在函数式编程中也是如此。这就是 CT 如此有用(也如此通用)的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    相关资源
    最近更新 更多