5

我最近注意到我经常编写函数,这些函数只是迭代另一个函数f直到它达到一个固定点(例如f x == x

我认为这是一个非常笼统的概念,所以我认为可能有一个内置的。

所以我想知道是否有内置的,或更通用的?

所以我基本上在寻找这个:

fixedpoint f x= head . dropWhile(\y->y /= f y) $ iterate f x

我只是在谷歌上搜索时遇到了麻烦,因为我只fix在我的搜索词包含fixed point或类似的东西时才找到对该函数的引用。

4

3 回答 3

5

自己写就行了。直接版本将比使用dropWhile.

hammer :: Eq a => (a -> a) -> a -> a
hammer f x
  | x' == x = x'
  | otherwise = hammer f x'
  where x' = f x
于 2016-08-15T12:59:25.160 回答
1

你的函数有签名Eq a => (a -> a) -> a -> a

使用 hoogle 进行搜索,我没有看到任何完全匹配的内容。最接近的匹配是until

until :: (a -> Bool) -> (a -> a) -> a -> a

基本前奏曲

until p f产生应用f直到p保持的结果。

您可能会使用它来编写函数,但因为您需要/=约束Eq

于 2016-08-15T13:01:31.317 回答
1

如果您正在寻找内置函数,因为您想要一个没有任何辅助功能的简短表达式,我可以推荐

until=<<((==)=<<) :: Eq a => (a -> a) -> a -> a

可以说这看起来有点奇怪,但实际上它只是 的无点等价物,使用可以表示为两次until (\x -> f x == x) f的事实。f (g x) x(f=<<g) x

于 2017-10-08T09:54:30.370 回答