scala - 函数组合、Kleisli 箭头和一元定律

标签 scala functional-programming monads kleisli

看完这篇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) ?
  • 我们能从这些法则中推导出一元法则吗?这些定律和一元定律等效吗?
  • 最佳答案

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

  • 是的,他们确实符合。它们的一致性确实是它们被称为 Kleisli 的原因,因为 Kleisli 箭头加类型形成 Kleisli category单子(monad)的(每个单子(monad)都产生)。这也是为什么unit是这样称呼的:它是由克莱斯利箭组成的单位。
  • 是的,它们可以派生。使用转换 (f <=< g) x = f =<< (g x) (其中 <=<andThen ,而 =<< 可能类似于 Scala 中的 flip(bind))。推导的确切步骤可以找到here .
  • 关于scala - 函数组合、Kleisli 箭头和一元定律,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21499849/

    相关文章:

    json - Play : How to modify data while deserializing Json

    scala - 使用仅适用于较旧 Scala 版本的 Scala 库

    haskell - 函数单子(monad)真的提供了比函数应用仿函数更多的东西吗?如果是这样,是什么?

    objective-c - 是否有用于 Objective-C 的 'andand' monad 版本?

    scala - 用Scala编写脚本: How to launch an uncompiled script?

    scala - 有没有办法从列表创建元组(无需代码生成)?

    c# - 遍历列表列表?

    javascript - 用函数式编程风格计算数字?

    haskell - monad 和宏有什么区别?

    haskell - 如果两个 monad 转换器属于不同类型,但它们的底层 monad 属于同一类型,是否有原则性的方法来组合它们?