22

ArrowLoopを含む関数インスタンス

loop :: ((b,d) -> (c,d)) -> (b -> c)
loop f b = let (c,d) = f (b,d) in c

まず、署名に問題があります。どうすればb -> cから取得でき(b,d) -> (c,d)ますか? つまりc、結果のタプルの は入力の両方の要素に依存する可能性がありdます。

第二に、ここでの仕組みがわかりませんlet(c,d) = f (b,d)の循環定義が含まれていませんdか? どこdから来たの?正直なところ、これが有効な構文であることに驚いていますd

数学では、これは意味のあることです。たとえば、f は複雑な関数になる可能性がありますが、実数部 b のみを提供し、虚数部 d を選択するときに変化しない方法で選択する必要があります。 f (b,d) を評価すると、ある種の不動点になります。しかし、この類推が成り立つ場合、let式は何らかの形で d の不動点を「検索」する必要があります (複数存在する可能性があります)。それは私には魔法に近いように見えます。それとも、私は複雑すぎると思いますか?

4

2 に答える 2

14

これは、標準の定義と同じようにfix機能します。

fix f = let x = f x in x

つまり、再帰的に行うのとまったく同じ方法fixで不動点を見つけます。

たとえば、些細な例として、 を考えてみましょうloop (\((),xs) -> (xs, 1:xs)) ()。これはまるでfix (\xs -> 1:xs); 入力を無視し、d出力 (ここではxs) をメイン出力として使用します。loopアローはカリー化できないため、タプルの余分な要素には、入力パラメーターと出力値が含まれているだけです。階乗関数をどのように定義するかを考えてみましょうfix— カリー化を使用することになりますが、矢印を使用する場合は、追加のパラメーターと出力を使用しloopます。

基本的にloop、結び目を結び、それ自体の補助出力へのアクセスを矢印に与えます。ちょうどfix結び目を結び、それ自体の出力へのアクセスを入力として関数に与えます。

于 2012-03-24T23:30:15.767 に答える
6

「固定小数点の検索」はまさにこれが行うことです。これは、ハスケルの怠惰な行動です。詳細については、ウィキペディアをご覧ください。

于 2012-03-24T22:56:22.610 に答える