2016-08-15 9 views
2

私は最近、私はかなり頻繁にHaskellに固定小数点演算子がありますか?

(例えばf x == xこと)私はこれはかなり一般的な概念であると思ったので、私はそこに構築されるかもしれないと思う、それは固定点に到達するまで、ちょうど別の機能fを反復処理関数を記述することを気づきました

だから、私はそこにこれが組み込まれているのか、より一般的なものがあるのだろうと思っていましたか?

だから私は基本的にこれを探しています:私の検索用語がfixed pointまたは類似のものが含まれていたときに、私は唯一のfix機能への参照を見つけたので

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

私は、トラブルこれをグーグルがありました。

+0

@vikingsteve私が知っている限り、それは 'dropWhile'の補完に過ぎませんが、これでどのように固定点を見つけることができないのでしょうか? – flawr

+0

ここで、私の深みから私はここにいます。ちょっと考えました:) – vikingsteve

+0

私はまだあなたの努力に感謝しています=) – flawr

答えて

1

機能には、記号Eq a => (a -> a) -> a -> aがあります。

Using hoogle to search for thatと一致するものはありません。最も近い一致はuntil

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

下地プレリュード

until p fpが成立するまでfを適用した結果を得ています。

あなたはおそらく、あなたの関数を書くことを使用することができますが、/=を必要とするので、あなたはEq制約を必要としています。あなたが任意の補助機能のない短い表現をしたいので

場合
+0

あなたはペアで 'until'を使うことができますが、手で全部を行う方が簡単だと思います。 – dfeuer

+0

または 'last。 takeWhileDifferent。 iterate f'、または同様のwrite own 'last。 takeWhileDifferent'バリアント... takeWhileDifferent = https://github.com/ekmett/ad/blob/ac5e0c7091430d0c569ba893f78385ead70b918e/src/Numeric/AD/Internal/Combinators.hs#L51 – phadej

4

自分で書き込んでください。ダイレクトバージョンはdropWhileを使用するものより高速です。

+0

私はそれを行う多くの方法があることを知っていますが、私はそれがかなり一般的なファンクションであると仮定しているので、明示的に組み込みを探しています。 – flawr

+0

@ flawr、私はそれが特に一般的だとは思わない。 'until'は近いと思われますが、実際にこの目的のために使用するのは、それが価値があるよりも面倒です。 – dfeuer

1

あなたが探しているビルドでは、私は間違いなくこれは少し奇妙に見えるが、実際にはそれだけです

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

をお勧めすることができますuntil (\x -> f x == x) fに相当する無点は、f (g x) x(f=<<g) xで2回表現できるという事実を利用しています。

関連する問題