-3

我阅读了JOHN A DE GOES 关于无标签决赛的精彩博客。在 5.Fake Abstraction 一节中,他提到:

不幸的是,这些运算不满足任何代数定律——不满足!这意味着当我们编写多态代码时,我们无法对 putStrLn 和 getStrLn 进行一般推理。

据我们所知,这些操作可能是启动线程、创建或删除文件、按顺序运行大量单独的副作用等等。

他对应于以下无标记代数:

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

这是否意味着不可能为无标签代数编写定律,或者我是否误解了某些东西。

4

1 回答 1

3

一些东西:

  • John A De Goes,虽然知识渊博,但也有很多意见并表达出来,就好像它们是从数学中推断出来的,没有明确区分 - 这篇文章是系列文章的一部分,他基本上认为无标签决赛通常是一个糟糕的解决方案ZIO是个好人
  • 段落说无标记最终通常不遵循代数定律,这意味着我们不能例如考虑 IO monid/semigroup 和类似的。这是真的。但这并不意味着这些构造不能遵守某些合同(称为法律),因为这就是猫效应的全部意义所在
  • 没有人可以强迫您为代数编写定律,因为定律基本上是编写规范/测试的某种特殊方式,您可以在其中为某些类接口编写单独的测试,然后对于每个实现,您可以实例化此测试以检查您的实现是否履行合同- 是的,没有人可以强迫你为你的代码编写测试。但是,这几乎可以说是我们编写的所有代码,并且 TTFI 使您可以更轻松地指定广泛不同的实现的共同行为,然后仔细编写代码和测试,坚持对合同至关重要的部分一段特定的代码,同时也明确了这些对合约的依赖

所以是的,没有人可以强迫你为你的代数写定律,但是在图书馆里实现它们的人实际上是这样做的,如果你写自己的代数,你会被鼓励这样做,所以这个论点是牵强的,是有争议的。

于 2020-06-22T12:18:00.137 回答