4

関数 を使用して、この階乗の例がどのように機能するかを理解しようとしていますfix :: (a -> a) -> a

例:

factabs :: (Num a, Eq a) => (a -> a) -> a -> a
factabs fact 0 = 1
factabs fact x = x * fact (x-1)

f :: (Num a, Eq a) => a -> a
f = fix factabs

なぜこの型を持っているのかわかりませんfix factabs...fixは type の関数を期待していますが、それを typeの関数 (2 つのパラメーターを受け取る関数)a -> aに適用するにはどうすればよいでしょうか? (a -> a) -> a -> a私は完全に混乱しています...

limit基本的に、以下の関数を を使用するものに変換する方法を見つけようとしていfixました。助けていただければ幸いです。

limit f n
    | n == next       = n
    | otherwise       = limit f next
    where
      next = f n
4

2 に答える 2

3

fix は type の関数を期待していますが、それを typeの関数 (2 つのパラメーターを受け取る関数)a -> aに適用するにはどうすればよいでしょうか? (a -> a) -> a -> a私は完全に混乱しています...

これは、すべての Haskell 関数が 1 つのパラメーターしかとらないため機能します。よくこのタイプを思い浮かべますが…

(a -> a) -> a -> a

... 2 つの引数の関数の 1 つとして、次のように読むこともできます...

(a -> a) -> (a -> a)

... つまり、1 つの引数 (a -> a関数) を取り、1 つの引数 (型) の関数を生成する関数の 1 つaです。今、私たちが取ると...

fix :: (b -> b) -> b

factabs... に置き換えることで、どのように適合するbかを確認できます(a -> a)

limit基本的に、以下の関数を を使用するものに変換する方法を見つけようとしていfixました。

元の定義から始めて、 の再帰呼び出しを追加の引数に置き換え、この-with-an-extra-argument を にlimit渡すだけです (後でわかるように、型は簡単に一致します)。 limitfix

于 2015-08-01T23:09:57.040 に答える
0

limit記録のために、ここに私が質問に投稿した関数のバージョンを示しますfix

limit :: Eq a => (a -> a) -> a -> a
limit = fix (\g f x -> let x' = f x
                       in if x == x' then x else g f x')
于 2015-08-05T14:45:01.950 に答える