Haskell中有不动点运算符吗?
Is there a fixed point operator in Haskell?
我最近注意到我经常编写的函数只是迭代另一个函数 f
直到它到达一个固定点(这样 f x == x
)
我认为这是一个非常笼统的概念,所以我认为可能有一个内置的。
所以我想知道是否有内置的或更通用的东西?
所以我基本上是在寻找这个:
fixedpoint f x= head . dropWhile(\y->y /= f y) $ iterate f x
我在谷歌搜索时遇到了问题,因为我只在我的搜索词包含 fixed point
或类似内容时才找到对 fix
函数的引用。
自己写吧。直接版本将比使用 dropWhile
.
的版本更快
hammer :: Eq a => (a -> a) -> a -> a
hammer f x
| x' == x = x'
| otherwise = hammer f x'
where x' = f x
您的函数具有签名 Eq a => (a -> a) -> a -> a
。
Using hoogle to search for that,我没有看到任何完全匹配项。最接近的匹配项是 until
until :: (a -> Bool) -> (a -> a) -> a -> a
base Prelude
until p f
yields the result of applying f
until p
holds.
您可能会使用它来编写您的函数,但因为您需要 /=
,所以您需要 Eq
约束。
如果你正在寻找一个内置的,因为你想要一个没有任何辅助函数的简短表达式,我可以推荐
until=<<((==)=<<) :: Eq a => (a -> a) -> a -> a
可以说这看起来有点奇怪,但实际上它只是无点等价于until (\x -> f x == x) f
,利用f (g x) x
可以被(f=<<g) x
表达两次的事实。
我最近注意到我经常编写的函数只是迭代另一个函数 f
直到它到达一个固定点(这样 f x == x
)
我认为这是一个非常笼统的概念,所以我认为可能有一个内置的。
所以我想知道是否有内置的或更通用的东西?
所以我基本上是在寻找这个:
fixedpoint f x= head . dropWhile(\y->y /= f y) $ iterate f x
我在谷歌搜索时遇到了问题,因为我只在我的搜索词包含 fixed point
或类似内容时才找到对 fix
函数的引用。
自己写吧。直接版本将比使用 dropWhile
.
hammer :: Eq a => (a -> a) -> a -> a
hammer f x
| x' == x = x'
| otherwise = hammer f x'
where x' = f x
您的函数具有签名 Eq a => (a -> a) -> a -> a
。
Using hoogle to search for that,我没有看到任何完全匹配项。最接近的匹配项是 until
until :: (a -> Bool) -> (a -> a) -> a -> a
base Prelude
until p f
yields the result of applyingf
untilp
holds.
您可能会使用它来编写您的函数,但因为您需要 /=
,所以您需要 Eq
约束。
如果你正在寻找一个内置的,因为你想要一个没有任何辅助函数的简短表达式,我可以推荐
until=<<((==)=<<) :: Eq a => (a -> a) -> a -> a
可以说这看起来有点奇怪,但实际上它只是无点等价于until (\x -> f x == x) f
,利用f (g x) x
可以被(f=<<g) x
表达两次的事实。