我读了JOHN A DE GOES 关于无标签决赛的精彩博客。在5.假抽象一节中,他提到:
不幸的是,这些运算不满足代数定律——没有 任何!这意味着当我们编写多态代码时,我们有 没有办法对putStrLn和getStrLn进行一般推理。
据我们所知,这些操作可能是启动线程,创建 或删除文件,运行大量单独的副作用 按顺序排列,依此类推。
他对应于以下无标签代数:
trait Console[F[_]] {
def putStrLn(line: String): F[Unit]
val getStrLn: F[String]
}
这是否意味着,为无龄代数编写定律是不可能的,还是我误解了什么。
几件事:
- John A De Goes,虽然知识渊博,但也有很多观点,并表达它们,就好像它们是从数学中推断出来的,没有做出明确的区分 - 这篇文章是系列的一部分,他基本上认为无标签决赛通常是一个糟糕的解决方案,而 ZIO 是一个很好的解决方案。
- 段落说无标签决赛通常不遵循代数定律,这意味着我们不能例如考虑 IO monid/semigroup 和类似的东西。这是真的。但这并不意味着这些结构不能遵守某些合同(称为法律(,因为 do 和 这就是猫效应的重点
- 没有人可以强迫你为代数编写定律,因为法律基本上是编写规范/测试的某种特定方式,你为某些接口类编写一个单独的测试,然后对于每个实现,你可以实例化这个测试来检查你的实现是否满足合同 - 是的,没有人可以强迫你为你的代码编写测试。但是,这几乎可以说是我们编写的所有内容,TTFI为您提供了更容易地指定广泛不同实现的通用行为的好处,然后仔细编写代码和测试,坚持对特定代码段至关重要的合约部分,同时也使这些对合约的依赖明确。
所以,是的,没有人可以强迫你为你的代数写定律,但是在图书馆中实现它们的人实际上是这样做的,如果你写自己的代数,你会被鼓励这样做,所以这个论点是延伸和不可靠的。