10
4

1 回答 1

0

两种代数之间的区别是有效代数和无效代数之间的区别。实际上,也可以像这样在 Dotty (Scala3) 中使用 GADT 编写 UserRepo:

enum UserRepo[A]{
  case GetUserById(id: UserID) extends UserRepo[User]
  case GetUserProfile(user: User) extends  UserRepo[UserProfile]
  case UpdateUserProfile(user: User, profile: UserProfile) extends UserRepo[Unit]
}

如果我们抛开final tagless 如何与代数相关的问题并接受它们与 GADT 同构,那么我们可以用代数来重新表述这个问题。看起来 Andrej Bauer 在 2019 年 3 月的讲义中详细回答了这个问题。What is Algebraic about Effects and Handlers

Andrej Bauer 清楚地解释了代数是什么,从签名开始,然后继续解释什么是理论的解释和模型。然后他继续在“§2 计算效应作为代数运算”中通过代数的参数化对有效计算进行建模。完成后,我们得到的代数与我想知道的代数非常相似。

在“§4 关于代数效应和处理程序的代数是什么?” 他展示了这种参数化代数的对偶如何为我们提供了对很明显是余代数的共同解释、共同模型和合作。

有人告诉我,这些处理效果的方式与使用 monad 不同,我需要弄清楚区别是什么,以及这是否会影响问题。

于 2019-09-24T08:18:10.480 回答