无标签代数需要定律吗?

Do tagless algebra needs laws?

我读了 JOHN A DE GOES 关于无标签决赛的精彩 blog。在5.Fake抽象部分,他提到:

Unfortunately, these operations satisfy no algebraic laws—none whatsoever! This means when we are writing polymorphic code, we have no way to reason generically about putStrLn and getStrLn.

For all we know, these operations could be launching threads, creating or deleting files, running a large number of individual side-effects in sequence, and so on.

他对应以下无标签代数:

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

这是否意味着,为无代数写法是不可能的,或者我误解了什么。

一些事情:

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

所以是的,没有人可以强迫你为你的代数写法则,但是在图书馆中实现它们的人实际上是这样做的,如果你写你自己的代数,我们鼓励你这样做,所以这个论点被拉长了和议论。