【问题标题】:Is there a fixed point operator in Haskell?Haskell 中是否有定点运算符?
【发布时间】:2016-12-21 16:11:23
【问题描述】:

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

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

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

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

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

我在谷歌上搜索时遇到了麻烦,因为每当我的搜索词包含 fixed point 或类似内容时,我才发现对 fix 函数的引用。

【问题讨论】:

  • ghci 表示该函数的类型是Eq a => (a -> a) -> a -> a。 Hoogle 似乎没有为该签名返回有用的结果。
  • 最接近的是until :: (a -> Bool) -> (a -> a) -> a -> a until p f yields the result of applying f until p holds. - 看起来你可以使用它来编写你的函数,但你仍然需要Eq 约束
  • @Daenyth 谢谢,我不知道你可以这样使用 hoogle=) 如果你将其添加为答案,我会接受。

标签: haskell fixed-point-iteration


【解决方案1】:

自己写吧。直接版本会比使用 dropWhile 的版本快。

hammer :: Eq a => (a -> a) -> a -> a
hammer f x
  | x' == x = x'
  | otherwise = hammer f x'
  where x' = f x

【讨论】:

  • 我知道有很多方法可以做到这一点,但我明确地寻找一个内置的,因为我假设它是一个很常见的功能。
  • @flawr,实际上,我认为这并不常见。 until 似乎最接近,但实际上将它用于此目的是麻烦大于它的价值。
【解决方案2】:

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

Using hoogle to search for that,我没有看到任何精确匹配。最接近的匹配是until

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

基本前奏

until p f 产生应用f 直到p 成立的结果。

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

【讨论】:

  • 您可以将until 配对使用,但我认为手动完成整个操作会更简单。
  • last . takeWhileDifferent . iterate f,或类似的写自己的last . takeWhileDifferent变体... takeWhileDifferent = github.com/ekmett/ad/blob/…
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 2011-02-19
    • 2011-11-28
    • 2014-09-08
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多