- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
背景
Haskell和Scala社区最近对他们所谓的无标签编程的最终“模式”非常着迷。这些被称为初始自由代数的对偶,所以我想知道Tagless Final是最终的。在ncatlab上,只能找到最终的代数,而不是最终的代数。
在CS-理论栈交换上问问题What Category are Tagless Final Algebras Final In,我得到了一个很好的答案,指向此博客文章Final Algebra Semantics is Observational Equivalence。因此,这些确实是最终的代数,但与初始代数不在同一类代数中。
题
但是,当我们研究如何使用最终的无标签时,我们发现它经常应用于看起来像代数的事物。例如,请参见The False Hope of Managing Effects with Tagless-Final in Scala的第1部分中的Console
或UserRepository
的两个示例。
因此,看起来像许多人将F
与Coalgebras(即地图F(X) ⟹ X
)一起使用,并且表示过程,而不是使用在类别论中用endofunctors final tagless
表示的代数以X ⟹ F(X)
形式表示。这些真的是同一回事吗?还是这里发生了其他事情?
ADT和最终无标签
在代数上
让我们从Olivier Blanvillain的Scala translation of examples taken from coursework on in Haskell对最终无标签的解释开始。一个人注意到这始于一个代数数据类型,它确实是一个代数结构的原型:一个组。
在类别中,可以使用多项式函子构建组F[X] = X×X + X + 1
将任何类型带到该类型对或该类型对或1的类型。然后为X选择一个特定类型,例如A代数是函数F[A] ⟹ A
。最广为人知的组是正负自然数的集合,0表示ℤ,因此我们的代数为:
ℤ×ℤ + ℤ + 1 ⟹ ℤ
+: ℤ×ℤ ⟹ ℤ
,
-: ℤ ⟹ ℤ
和常数
zero: 1 ⟹ ℤ
。如果我们改变类型X,我们将得到不同的代数,并且这些代数形成一个类别,它们之间具有同态射态,其中最重要的是初始代数。
enum IExp {
case Lit(i: Int)
case Neg(e: IExp)
case Add(r: IExp, l: IExp)
}
import IExp._
val fe: IExp = Add(Lit(8), Neg(Add(Lit(1), Lit(2))))
fe
或
IExp => Int
来解释
IExp => String
结构,这些函数是代数范畴中的态射,
String
或
Int
)的代数。这种形态被称为折叠。 (请参阅1997年的
The Algebra of Programming, by Richard Bird and Oege de Moor书)
trait Exp[T] {
def lit(i: Int): T
def neg(t: T): T
def add(l: T, r: T): T
}
def tf0[T] given (e: Exp[T]): T =
import e._
add(lit(8), neg(add(lit(1), lit(2))))
given as Exp[Int] {
def lit(i: Int): Int = i
def neg(t: Int): Int = -t
def add(l: Int, r: Int): Int = l + r
}
tf0[Int] // 5
Exp
的
given
(或在Scala 2
implicit
中)。
UserRepository
为例,
trait UserRepository {
def getUserById(id: UserID): User
def getUserProfile(user: User): UserProfile
def updateUserProfile(user: User, profile: UserProfile): Unit
}
UserRepository
的结合代数。
S ⟹ F[S]
S ⟹ (Uid → User) × (User → Profile) × (User × Profile → S)
F(X)
将任何类型的
X
带到3个元组的函数中。
S ⟹ F(S)
。我们有2种观察方法
getUserById
和
getUserProfile
,以及一种改变一个
updateUserProfile
的状态,也称为二传手。通过改变状态的类型
F[_]
生成的,如下所示:
trait UserRepository[F[_]] {
def getUserById(id: UserID): F[User]
def getUserProfile(user: User): F[UserProfile]
def updateUserProfile(user: User, profile: UserProfile): F[Unit]
}
UserRepository
的ADT是什么?
最佳答案
两种类型的代数之间的区别是有效代数和无效代数之间的区别。实际上,也可以像这样在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]
}
关于scala - 在Coalgebras上使用Tagless Final(对象代数)可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58025604/
我已经将一些变量声明为 bool 值,我希望 C++ 在我进行一些 bool 加法时知道该做什么,但它并没有按照我希望的方式发生。我如何让它工作。 #include using namespace s
我正在创建小型配置文件查看器,我想在 SQL 中模拟环。怎么运行的?对于简单:我的 table 上有 5 个用户。当我从中间获得一个到我的实验(如用户编号 2、3、4)时,下一个和上一个用户是 CUR
我计划使用低级 API 实现 FUSE 文件系统,目前正在尝试了解 fuse_entry_param结构体。 不知道是什么unsigned long fuse_entry_param::generat
从事 JS 工作,刚刚开始学习 boolean 代数。想知道是否有办法简化这个表达式: (!variableOne || !variableTwo) 我记得听说过两个“not”意味着你可以改变符号,但
我有这个 F-代数 (introduced in a previous question),我想在它上面施放一个有效的代数。通过绝望的试验,我设法组合了一个有效的 monadic catamorphi
我在 Google 上到处寻找德摩根定律的 bool 代数(不是集合论)证明,但找不到。 Stack Overflow 也缺少 DeMorgan 定律问题。 作为我的 CIS 251 类(class)
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
正在解决这个问题。 验证闰年的基本规则如下: - 大多数能被4整除的年份都是闰年。 - 异常(exception):世纪年不是闰年,除非它们可以被 400 整除。 这就是答案: if(y%4==0 &
假设算法的最坏情况运行时间可以描述为: T(n) = O(n) + O(r^2) + O(n-r) n 是输入大小,r 是根据算法创建分区的索引。 这个等式可以进一步简化吗?如果变量都是 n 那么它将
有没有办法在 JS 中使用 bool 代数? 例如,我想遍历一个包含 true 和 false 的数组,并将其简化为只有 true 或 false。 用 bool 代数来做这件事似乎是一种优雅的方式.
假设我有两个数据框 df1 df2 我可以加入 df1_keys 和 df2_keys。 我想做的事: (A-B) (A-B) U (B-A) A=df1 和 B=df2。 根据我在 document
这个问题已经有答案了: How can I remove a flag in C? (3 个回答) How to set, clear, and toggle a single bit? (27 个回
大家 我实现了自定义聚合 pig UDF。UDF 实现了 Algebraic 接口(interface),并且有 3 个类 - Initial、Intermed 和 Final 在不同阶段进行工作。它
我想制作一个 bool 向量,它是通过比较两个输入 bool 向量创建的。我可以使用 for 循环,但有更好的方法吗? 我理想的解决方案是这样的: df['A'] = [True, False, Fa
我想编写一个 pig 代码来执行分组并生成 31 个字段的总和,但在此之前我需要做一些自定义处理,为此我编写了一个 eval 函数。我想如果我可以将 GROUP 和 SUM 操作包含到 UDF 中,我
我试图通过 boolean 代数来理解使用 4 个与非门如何等同于 1 个异或门。 如果我们从维基百科看这张图片 http://en.wikipedia.org/wiki/XOR_gate#Alter
我是一名优秀的程序员,十分优秀!