【问题标题】:Scalaz Kleisli usage benefitsScalaz Kleisli 使用优势
【发布时间】:2015-03-14 12:54:13
【问题描述】:

scalaz Kleisli[M[_], A, B]A => M[B] 的包装器,它允许组合这些函数。例如,如果M[_] 是单子,我可以将Kleisli[M, A, B]Kleisli[M, B, C]>=> 组合起来得到Kleisli[M, A, C]

简而言之,Kleisli 根据M 提供精美的andThens。这是正确的吗 ?使用Kleisli 还有其他好处吗?

【问题讨论】:

    标签: scala scalaz kleisli


    【解决方案1】:

    这里有两个好处作为例子——我相信你可以想出其他的。

    首先,抽象不同的箭头可能很有用,例如Kleisli[M, ?, ?]? => ?。例如,我可以编写一个泛型函数,该函数将应用自同态一定次数。

    def applyX10[Arr[_, _]: Category, A](f: Arr[A, A]) =
      List.fill(10)(Endomorphic(f)).suml
    

    现在我可以在例如Int => IntKleisli[Option, Int, Int]:

    val f = (_: Int) + 1
    
    val k = Kleisli.kleisli[Option, Int, Int] {
      case i if i % 2 == 0 => Some(i * 3)
      case _ => None
    }
    

    然后:

    scala> applyX10(f).run(1)
    res0: Int = 11
    
    scala> applyX10[=?>, Int](k).run(2)
    res1: Option[Int] = Some(118098)
    

    (注意A =?> B 只是Kleisli[Option, A, B] 的别名。)

    其次,如果F 确实存在,Kleisli[F, ?, ?] 具有 monad 实例这一事实也很有用。例如,请参阅 my answer here,了解如何将一元组合与 ReaderT 一起使用,这只是 Kleisli 的别名。

    【讨论】:

    • 谢谢。我将尝试按如下方式grok:(1)Kleisli 通常作为对不同箭头的抽象(2)特殊情况:例如ReaderT、读者单子等
    • 嗯,对于一个单子MKleisli[M, ?, ?]一个箭头。
    猜你喜欢
    • 2011-02-03
    • 1970-01-01
    • 2011-11-22
    • 2014-11-09
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多