转换计算定点的函数
|
我有一个函数,它根据迭代来计算固定点:
equivalenceClosure :: (Ord a) => Relation a -> Relation a
equivalenceClosure = fst . List.head -- \"guaranteed\" to exist
. List.dropWhile (uncurry (/=)) -- removes pairs that are not equal
. U.List.pairwise (,) -- applies (,) to adjacent list elements
. iterate ( reflexivity
. symmetry
. transitivity
)
注意,我们可以从中抽象为:
findFixedPoint :: (a -> a) -> a -> a
findFixedPoint f = fst . List.head
. List.dropWhile (uncurry (/=)) -- dropWhile we have not reached the fixed point
. U.List.pairwise (,) -- applies (,) to adjacent list elements
. iterate
$ f
可以用fix来编写此功能吗?似乎应该从该方案向其中已修复的事物进行转换,但是我没有看到它。
没有找到相关结果
已邀请:
2 个回复
念炯
)可能需要函数应用程序序列的起始值。将此与
函数进行比较,后者不需要这样的起始值(请注意,类型已经舍弃了此值:
是
类型,而
是
类型)。这是内在的,因为这两个功能在本质上是不同的。 让我们对此进行更深入的研究。首先,我应该说,您可能需要提供一些更多的信息(例如,您的成对实现),但是要进行一次天真的尝试,而我(可能是有缺陷的)实现我认为您希望成对实现的目标,则您的
函数等效于
,仅适用于某些类函数 让我们看一些代码:
将此与“ 3”的定义进行对比:
并且您会注意到我们正在找到一种非常不同的不动点(即,我们从数学意义上滥用了惰性求值方法来为函数应用生成一个不动点,在这种情况下,我们仅在对结果函数进行*时才停止求值,应用于自身,得出相同的函数)。 为了说明,让我们定义一些功能:
让我们来看看
和
之间的区别:
现在,如果我们无法指定起始值,
的作用是什么?事实证明,通过在λ微积分中添加ѭ3,我们可以指定递归函数的求值。考虑
,我们可以将
的不动点计算为:
其中在计算
时会重复应用
本身,直到达到相同的函数,然后使用值
进行调用。我们可以在下面看到:
那么,这意味着什么?根据要处理的功能,您不一定能够使用ѭ3来计算所需的不动点类型。据我所知,这取决于所讨论的功能。并非所有函数都具有
计算的定点! *我避免谈论领域理论,因为我相信这只会混淆本来就很细微的话题。如果您很好奇,ѭ3会找到某种固定点,即函数所指定的位姿的最小可用固定点。
厦惫
定义函数function4ѭ。 正如Raeez指出的那样,可以用
定义递归函数。 您感兴趣的函数可以递归定义为:
这意味着我们可以将其定义为
,其中
是:
举一个具体的例子,假设
被定义为
很容易看出,对于每个有限列表
,我们都有
。 这是当\“ value参数\”为[]时,
的工作方式:
另一方面,如果\“ value参数\”为[42],我们将有: