【问题标题】:Typeclass dependency with tagless-final带有无标签最终的类型类依赖
【发布时间】:2019-06-20 12:07:06
【问题描述】:

在观看了 John De Goes 的“FP to the Max”(https://www.youtube.com/watch?v=sxudIMiOo68) 之后,我想知道以无标记最终模式编写 FP 程序的方法。

假设我有一些 typeclass 用于对副作用进行建模(以他的 Console 为例):

trait Console[F[_]] {
  def putStrLn(str: String): F[Unit]
  def getStrLn: F[String]
}

你将如何依赖Console

隐式

就像他在视频中展示的那样:

def inputLength[F[_]: Functor: Console]: F[Int] =
  Console[F].getStrLn.map(_.length)

优点:函数签名很干净,可以从 typeclass 自动派生中受益

明确

通过将实例直接传递给函数:

def inputLength[F[_]: Functor](console: Console[F]): F[Int] =
  console.getStrLn.map(_.length)

优点:这允许您根据需要明确连接依赖项,并且感觉不那么“神奇”

不确定编写此函数的最佳/最惯用的方法是什么,不胜感激。

谢谢!

【问题讨论】:

    标签: scala functional-programming tagless-final


    【解决方案1】:

    当您通过隐式参数依赖类型类实例时,您可以确定一件事,那就是您可以在编译时确定类型类的实例(除非您提供它明确地,哪种方式违背了目的,然后我们回到示例 2)。相反,如果您无法在编译时确定该类的实例,例如,当您依赖配置参数来确定实例类型时,那么任何类型的隐式参数都不是再合适不过了。

    因此,根据我自己的观点和喜好,我想说的是,只要可以在编译时确定实例并让编译器找出接线,就这样做,因为正如您所说,您从中受益匪浅,例如在可用时享受自动类型类派生的能力。

    “神奇”的论点虽然可以理解,但表明无论谁说这句话,他在编程的语言中还有很长的路要走,并且需要了解事情是如何工作的,这完全可以,但不是一个足够好的理由不通过隐式参数使用类型类实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      相关资源
      最近更新 更多