如何在Scala中隐式函数类型可以对效果进行建模?

零无

隐式函数类型计划在Scala 3.0中使用,并声称支持“效果功能”并且是可组合的。它被提出作为monad变压器的更好替代品。但是,阅读更多的解释后,隐式函数类型似乎只能对Reader monad建模。我想念什么吗?

尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

立刻,最简单的是注意到隐式函数类型使我们能够对Reader monad进行编码,而该monad主要是自由分配的,但是却失去了理解语法的便利性。

认为Odersky在谈到“更好的替代monad转换器”时所指的是,隐式函数类型使您可以编码相当简单的自由monad(无双关),这是构成monadic效果的一种方法。 。

来自以下关于话语的评论(重点是我的话):

我猜我们俩都同意,将来我们将拥有非常精细的效果系统,以至于很多代码以某种方式有效。但是随后,您最终会以Monad结构编写程序的大部分内容。结构本身不会告诉您代码具有什么作用;您需要转到该类型。

另一方面,每次引入一个新的效果类别(它可能像“未证明是完全的”一样普遍存在)时,您需要将代码完全重构为monadic方案。这意味着您愿意(我估计)减慢10,冒着堆栈溢出的风险,非常冗长,并且很难组合所有细粒度的效果。否则,你就自由了,这意味着更好的构图,但可能会更多在您非常有力地告诉您的用户的意义上,我可以看到这项工作:“不要使用效果,太痛苦了”。因此它可能具有教育价值。但是,如果您必须处理效果,那么它在几个方面就完全不是最佳选择。

在他的论文《隐式函数类型的基础》中,Odersky提出了一种使用隐式函数类型对自由monad进行编码的替代方法,该方法需要更少的样板代码:

// Free definition
type FreeIFT[A[_], M[_], T] = implicit Natural[A, M] => implicit Monad[M] => M[T]

// GADT defintion
enum KVStoreB[T] {
  case Put(key: String, value: Int) extends KVStoreB[Unit]
  case Get(key: String) extends KVStoreB[Option[Int]]
}

// Lifted definition
import KVStoreB._
type KVStoreIFT[M[_], T] = FreeIFT[KVStoreB, M, T]

def iftExpr[M[_]]: KVStoreIFT[M, Option[Int]] =
  for {
    _ <- Put("foo", 2).lift
    _ <- Put("bar", 5).lift
    n <- Get("foo").lift
  } yield n

// Free interpeter
def iftInterpreter = new Natural[KVStoreB, Future] {
  def apply[T](fa: KVStoreB[T]): Future[T] = ???
}

// Running the interpreter over the free structure
val iftOutput: Future[Option[Int]] = iftExpr[Future](iftInterpreter)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在 Scala 中定义带有类型参数的隐式函数?

Scala 中的隐式函数类型

如何在Scala中正确使用歧义隐式进行类型求反

Scala如何确定TreeSet构造函数的隐式类型参数

如何在scala中找到隐式函数或变量

如何在成员函数中使用隐式类型转换?

如何在函数参数中强制执行类型并避免隐式转换?

如何创建可以对bash中的数组进行排序的函数?

如何在函数式编程中为继承关系建模

隐式排序[Option [T]]如何在Scala中工作?

Scala中依赖类型的隐式解析

如何在Gurobi Python目标函数中对`if`条件进行建模?

如何在Python类函数中隐式传递参数

如何在匿名函数中隐式设置多个参数?

如何在某些R函数中隐式调用列

Scala中的隐式函数。怎么运作的?

在Scala中设置隐式函数返回

Scala中的条件隐式函数

在函数中需要Scala隐式类

如何在 Scala 中创建一种仅基于类型生成 sqlcontext 隐式编码器的方法?

具有函数curring的reduc vs非隐式方法中的scala隐式类方法类型不匹配

Scala-如何创建可用于类型构造函数的单个隐式

在Scala中,如何隐式调用仅知道其超级类型的类型类?

解决隐式时,Scala如何使用显式类型?

具有隐式泛型类型的Scala模拟函数

如何在return语句中的“隐式”右值上进行类型转换

可以控制Lisp的FORMAT函数进行的隐式转换吗?

隐式def中的Scala更高类型的类型失败,并显示“找不到隐式值”

C ++如何在不进行隐式转换的情况下模拟函数?