我理解fix函数在 Haskell 中的工作原理没有任何问题,但我就是无法理解Fix数据类型。 我相信我明白了它背后的想法,但我就是无法理解Fix数据类型定义是如何在幕后工作的。 因此, Fix的定义如下: 我在脑海中解析这个定义的方式是,作为数据类型的Fix是具有一个字段unfix的记录,其类 ...
我理解fix函数在 Haskell 中的工作原理没有任何问题,但我就是无法理解Fix数据类型。 我相信我明白了它背后的想法,但我就是无法理解Fix数据类型定义是如何在幕后工作的。 因此, Fix的定义如下: 我在脑海中解析这个定义的方式是,作为数据类型的Fix是具有一个字段unfix的记录,其类 ...
我是 Haskell 的新手,我有以下代码: 我希望xs被评估为[1,2,3,4,2,4,4] ,因为这是不动点,即[1,2,3,4,2,4,4] == [1,2,3,4] ++ second [1,2,3,4,2,4,4] 。 但是,当我尝试在 GHCi 中评估xs时,我得到 但它不会停止计算。 ...
fix f = let {x = fx} in x 谈到let ,我认为let P = Q in R将评估 Q -> Q' 然后 P 被 R 中的 Q' 替换,或者: R[P -> Q'] 。 但是在fix定义中Q取决于R,那么如何评估呢? 我想这是关于惰性评估的。 Q'变成了一个重 ...
我真的很喜欢repmin问题: 记下repmin :: Tree Int -> Tree Int ,它在一次传递中将树中的所有数字替换为其最小值。 如果我在 python 中写这样的东西,我会通过它们的引用传递值(假设单元素列表而不是数字就足够了): def repmin(tree, ...
我一直在尝试使用Control.Arrow.loop写下mfix 。 我想出了不同的定义,并想看看哪个是mfix的实际工作相似。 因此,我认为正确的解决方案如下: 可以看到, loop. Kleisli loop. Kleisli的论点适用于Applicative实例。 我发现这是一个好兆头,因为 ...
编辑:这篇文章中的fix代表通常写在 Haskell 中的定点组合,而不仅仅是Data.Function.fix 。 众所周知, fix可能是非共享的,因为 GHC 并不总是消除常见的子表达式: 长话短说:“如果您关心 CSE,请亲自动手。” 使用S -combinator 可以很容易地无点写下 ...
我已经意识到以下程序 速度惊人。 它比递归定义快得多: 我很难理解定点定义实际上归结为哪种程序算法。 仅仅是因为 Haskell 的编译器做了一些巧妙的优化,还是它本质上很快? 让我们稍微解开固定点: Haskell 编译器是否识别 x = y 和“短路保险丝”? 它会更多地了解列表 x,还是会从 ...
在 Haskell 关于不动点的文本中,经常提到最小和最大不动点。 例如在Data.Functor.Fixedpoint文档或这里。 最小和最大暗示所涉及类型的顺序(或者仅在固定点上定义它就足够了吗?)无论如何,我从来没有看到这个顺序被明确表示。 在 Haskell 中,一个固定点大于另一个固定点 ...
我试图说服自己类型Fix和 function fix是一回事。 但我找不到它们定义之间的相关性 -- definition of fix fix :: (p -> p) -> p fix f = let {x = f x} in x -- or fix f = f (fix f) -- ...
我不知道如何将fix表示为尾递归算法。 或者它已经是尾递归了? 可能是我多虑了... const fix = f => x => f(fix(f)) (x); // redundant eta abstraction due to eager eval const sum ...
我最喜欢的一种测试我正在学习的语言的能力的方法是尝试和实现各种定点组合器。 由于我正在学习 Clojure(尽管我对 lisps 并不陌生),因此我也做了同样的事情。 首先,一些“可测试”的代码,阶乘: (def !' "un-fixed factorial function" (fn [ ...
(这不是一个特别的Haskell问题。) 我有一个递归数据结构。 我想在每个级别附加一些额外的信息。 这是一个简化的示例,其中我将X或Y到树的每个级别: (对我来说, TreeF的定义是不自然的。我宁愿定义data Tree a = Leaf a | Tree a (Tree ...
我尝试学习haskell并进行练习-尝试使用功能修复来重写标准列表操作(地图,文件夹,zip,迭代等)。 我有重复的例子: 并进一步简化 有人可以帮我做地图吗? 对不起,我不好意思,谢谢你。 ...
这是Haskell中定点组合器的通常定义: 在https://wiki.haskell.org/Prime_numbers上 ,他们定义了一个不同的定点组合子: _Y是一个非共享的固定点组合器,在这里安排递归的“伸缩”多级素数生产(生产者塔 )。 这到底是什么意思? ...
大家好,我正在尝试实现高阶函数修正,该修正会从初始点x计算任意函数f :: a -> a的吸引人的不动点 。 也就是说,对于给定的f和x ,形式为fᴷ(x)的不动点。 我目前的尝试是: 注意:如果函数未从起点收敛,则函数不会终止 。 有人能帮助我吗 ? 我尝试过,但没 ...
我觉得理解一个仿函数的固定点的抽象概念,但是,我仍然在努力弄清楚它的确切实现及其在Haskell中的变形。 例如,如果我定义,如根据“程序员类别理论”一书 - 第359页,下面的代数 根据catamorphism的定义,可以将以下函数应用于ListF的固定点,即List,以计算其长 ...
Control.Arrow的loop描述: 循环运算符表示计算,其中输出值作为输入反馈,尽管计算仅发生一次。 它以箭头符号表示rec值递归构造的基础。 它的源代码,以及(->)实例化: 这立刻让我想起了fix点,固定点组合器: 所以我的问题是: ...
为什么在像 Haskell 这样的惰性非整体语言中,最小的固定点与最大的固定点重合。 完全偏序的连续性与此有什么关系? ...
由于Nothing >>= f = Nothing每个f都Nothing >>= f = Nothing ,下面的简单定义适用于mfix : 但这没有实际用途,因此我们有以下非全面定义: 如果这个let -clause不会停止,那么如果mfix f返回No ...