- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试在 Scala 中为虚构的部分类型实现 Kleisli 类别(阅读 Bartosz Milewski 的“程序员的类别理论”,这是第 4 章的练习)
object Kleisli {
type Partial[A, B] = A => Option[B]
implicit class KleisliOps[A, B](f1: Partial[A, B]) {
def >=>[C](f2: Partial[B, C]): Partial[A, C] =
(x: A) =>
for {
y <- f1(x)
z <- f2(y)
} yield z
def identity(f: Partial[A, B]): Partial[A, B] = x => f(x)
}
val safeRecip: Partial[Double, Double] = {
case 0d => None
case x => Some(1d / x)
}
val safeRoot: Partial[Double, Double] = {
case x if x < 0 => None
case x => Some(Math.sqrt(x))
}
val safeRootRecip: Partial[Double, Double] = safeRoot.>=>(safeRecip)
safeRootRecip(1d)
safeRootRecip(10d)
safeRootRecip(0d)
}
IDE (IntelliJ) 没有显示任何错误,但是当我运行这段代码时,我得到:
Error:(27, 57) value >=> is not a member of $line5.$read.$iw.$iw.Kleisli.Partial[Double,Double]
val safeRootRecip: Partial[Double, Double] = safeRoot.>=>(safeRecip)
在隐式类之外定义 >=>=>
效果很好。可能是什么原因?
最佳答案
@sinanspd 是对的。在 Dotty 中,代码似乎可以编译: https://scastie.scala-lang.org/n17APWgMQkWqy93ct2cghw
手动解决
val safeRootRecip: Partial[Double, Double] = KleisliOps(safeRoot).>=>(safeRecip)
编译但编译器本身没有发现这个转换
Information: KleisliOps{<null>} is not a valid implicit value
for App.safeRoot.type => ?{def >=> : ?} because:
type mismatch;
found : App.safeRoot.type (with underlying type App.Partial[Double,Double])
required: App.Partial[A,Double]
(which expands to) A => Option[Double]
val safeRootRecip: Partial[Double, Double] = safeRoot.>=>(safeRecip)
似乎没有推断类型参数 A
。
(顺便说一下,Martin Odersky 在这里解释了为什么语言中存在隐式转换会使类型推断变得更糟:https://contributors.scala-lang.org/t/can-we-wean-scala-off-implicit-conversions/4388)
尝试使 Partial
与 B
协变,并且(特别是)与 A
协变(类似于 A = > Option[B]
与 B
协变,与 A
协变)
type Partial[-A, +B] = A => Option[B]
然后代码似乎可以编译。
另一种解决方法是用类型类 (MyTransform
) 和隐式转换 (X => Y
, KleisliOps
) 替换隐式转换 ( myConversion
) 根据此类型类定义(sometimes 这有助于隐式转换)
trait MyTransform[X, Y] {
def transform(x: X): Y
}
implicit def myConversion[X, Y](x: X)(implicit mt: MyTransform[X, Y]): Y =
mt.transform(x)
type Partial[A, B] = A => Option[B]
implicit def partialToKleisliOps[A, B]: MyTransform[Partial[A, B], KleisliOps[A, B]] =
f1 => new KleisliOps(f1)
class KleisliOps[A, B](f1: Partial[A, B]) {
def >=>[C](f2: Partial[B, C]): Partial[A, C] =
(x: A) =>
for {
y <- f1(x)
z <- f2(y)
} yield z
def identity(f: Partial[A, B]): Partial[A, B] = x => f(x)
}
关于Scala Kleisli 在 IntelliJ 中抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62751493/
我想知道是否有办法转List[Kleisli[Option, Int, Int]]至 Kleisli[Option, Int, List[Int]] . 特别是我的 kleisli 列表是这样形成的:
我遵循优秀书籍Reactive Domain Modeling的设计,我需要混合Kleisli不同类型: object CombinedKleisli { type User = String
在 scalaz Kleisli[M[_], A, B]是 A => M[B] 的包装器,这允许组合这些函数。例如,如果 M[_] monad 是我可以写的 Kleisli[M, A, B]和 Kle
在尝试使用 Haskell 定义从连接 channel 读取的无限循环时,我想到了使用单子(monad)的 Kleisli 组合折叠部分应用函数的无限列表的想法。这个想法似乎合理且简单,但我遇到了一个
我最近偶然发现了 Kleisli 的概念,我阅读的每个教程/链接/引用资料都通过以下结构激发了 Kleisli 的使用: 组合返回 monad 的函数 : f: a -> m[b]与 g: b ->
我有一个从 Railway oriented programming 复制的验证模块在我的应用程序中执行错误处理: type ErrorMessage = ErrorMessage of string
这是 kleisli 组合的常见实现: kleisli :: Monad m => (a -> m b) -> (b -> m c) -> a -> m c kleisli = \f g x -> f
如何组合两个返回验证的函数?以下是我没有成功的尝试: scala> def f: Int => Validation[String, Int] = i => if(i % 2 == 0) Succes
看完这篇article我了解 >=> (Kleisli 箭头)只是组合函数的高阶函数,它返回“一元值”。例如: val f: A => M[B] = ... val g: B => M[C] = ..
我有一些方法的调用链,我通过 Kleisli 传递上下文。基本上我想将一个上下文传递给数据库访问层,但我想在两者之间的任何地方访问这个上下文。 以下示例完美运行。但我的问题是,我想访问 OrderSe
这是我之前 question 的后续 我们可以定义一个通过路径 (List[String], XmlNode) => Option[XmlNode] 查找 XML 节点的函数作为函数的组合 (Stri
给定一个方法 def f[A, B, C](a: A) : Kleisli[Future, B, C] = ??? 我需要一个使用 Option[A] 的组合器 我的第一次尝试是: def g[A,
我遵循了函数式和响应式(Reactive)建模一书中的设计原则。 因此所有服务方法都返回Kleisli。 问题是如何在这些服务上添加可更新缓存。 这是我当前的实现,是否有更好的方法(现有的组合器,更实
我不明白为什么 Demonbind1 的定义会产生一些编译器错误。它看起来像一个愚蠢的翻转,但不知何故.. {-# LANGUAGE GADTs #-} {-# LANGUAGE RankNTypes
检查 Kleisli 定义, in Cats, and Functional and Reactive Domain Modelling 但是我还不能理解它的用处。如果我们谈论组合 Monadic 函
尝试在 Scala 中为虚构的部分类型实现 Kleisli 类别(阅读 Bartosz Milewski 的“程序员的类别理论”,这是第 4 章的练习) object Kleisli { type
这个问题的灵感来自对我之前的 question 的反馈。 Scalaz 为函数 A => M[B] 提供了一个包装类 Kleisli[M[_], A, B] . 如果 M[_] 是一个半群,则 Kle
尝试在 Scala 中为虚构的部分类型实现 Kleisli 类别(阅读 Bartosz Milewski 的“程序员的类别理论”,这是第 4 章的练习) object Kleisli { type
这个问题的灵感来自对我之前的 question 的反馈。 Scalaz 为函数 A => M[B] 提供了一个包装类 Kleisli[M[_], A, B] . 如果 M[_] 是一个半群,则 Kle
我尝试用 Kotlin 编写 Kleisli 求幂: fun kleisli(n: Int, f: (A) -> B): (A) -> B = if (n == 1) f else { it ->
我是一名优秀的程序员,十分优秀!