- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
this的答案问题表明 Scala 中 Option 的 fold 方法是一种catamoprhism。来自维基百科 catamophism是“从初始代数到其他代数的独特同态。这个概念已被应用于函数式编程作为折叠”。所以这看起来很公平,但让我想到了 initial algebra作为F-algebras类别中的初始对象.
因此,如果 Option 上的折叠真的是一个 catamophism,则需要一些仿函数 F,以创建 F-代数的范畴,其中 Option 将是初始对象。我无法弄清楚这个仿函数是什么。
对于列表类型 A
仿函数 F
是 F[X] = 1 + A * X
.这是有道理的,因为 List 是一种递归数据类型,所以如果 X
是 List[A]
然后上面的内容是 A
类型的列表要么是空列表( 1
),要么是( +
)一对( *
)A
和一个 List[A]
.但是 Option 不是递归的。 Option[A]
就是 1 + A
(没有或 A
)。所以我看不到仿函数在哪里。
为了清楚起见,我意识到 Option 已经是一个仿函数,因为它需要 A
至 Option[A]
,但对列表所做的事情是不同的,A
是固定的,仿函数用于描述如何递归构造数据类型。
与此相关的是,如果它不是 catamorphism,它可能不应该被称为折叠,因为这会导致一些 confusion .
最佳答案
嗯,评论是在正确的轨道上。我只是一个初学者,所以我可能有一些误解。是的,重点是能够对递归类型进行建模,但我认为没有什么可以排除“非递归”F 代数。由于初始代数是方程 X ~= F X 的“最小不动点”解。在 Option 的情况下,解是微不足道的,因为不涉及递归:)
初始代数的其他例子:
List[X] = 1 + A * X 代表 list = Nil |缺点列表
Tree[X] = A + A * X * X 代表树 = 叶子 a |节点一棵树
以同样的方式:
Option[X] = 1 + A 代表 option = None |一些
“常数”仿函数存在的理由很简单,你如何表示树的节点?
事实上,要对(简单)递归数据类型进行代数建模,您只需要以下仿函数:
关于scala - Scala 的 Option 以何种方式折叠 catamorphism?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23724220/
假设我有如下定义(其中 cata 是 catamorphism): type Algebra f a = f a -> a newtype Fix f = Fx (f (Fix f)) unFix :
写完后this article我决定把钱放在嘴边,并开始将我以前的项目转换为使用 recursion-schemes . 有问题的数据结构是 lazy kdtree .请查看 explicit 的实现
我希望能够使用 cata来自 recursion-schemes Church 编码列表的包。 type ListC a = forall b. (a -> b -> b) -> b -> b 为方便
我正在尝试从第一原则 - 26.3 - Ex 5 编写 Haskell 编程的解决方案。 问题是编写一个适用于 monad 转换器变体的任一个 catamorphism 版本,EitherT。函数的类
对于表示自然数的数据类型: sealed trait Nat case object Z extends Nat case class S(pred: Nat) extends Nat 在 Scala
this的答案问题表明 Scala 中 Option 的 fold 方法是一种catamoprhism。来自维基百科 catamophism是“从初始代数到其他代数的独特同态。这个概念已被应用于函数式
下面是一些简单的列表 F 代数。他们与 cata 合作功能从 recursion-schemes图书馆。 import Data.Functor.Foldable algFilterSmall ::
我是一名优秀的程序员,十分优秀!