3

私は Haskell プログラミング コースで古い試験を復習していますが、この関数について頭を悩ませているようには見えません (与えられた情報が少なすぎると思います)。

与えられたコードは

myId x = x

function n f
 | n > 0 = f . function (n-1) f
 | otherwise = myId

たとえば、 input2 (*2)で関数を呼び出すと、結果として関数が得られることを知っています。そして、それを呼び出すと(-2) (*2) 1、結果が得られ1ます。

方法がわからないだけですか?また、関数の型キャストに頭を悩ませることもできません。

これら 2 つのオプションが正しいことはわかっていますが、その理由がわかりません (おそらく、現時点では括弧が混乱している可能性があります)。

function :: (Num a, Ord a) => a -> (a -> a) -> a -> a
function :: (Num a, Ord b) => a -> (b -> b) -> b -> b

この関数を「読む」方法と、型キャストがどのように機能するかを理解する方法を明確にできる人は誰でも(HaskellのプログラミングとHaskellの学習から私のプログラミングを読んでいますが、数日間サークルに参加しています)。

4

1 に答える 1

5

functionnいくつかの数値と関数を取りf :: a -> a、その関数をそれ自体でn何度も構成し、タイプの別の関数を返しa -> aます。返された関数が type の値に適用されると、前の各ステップの出力を次の入力として使用して、ループ回でa実行した場合と基本的に同じ結果になります。fn

おそらく、最後のパラメーターを明示的にすると、類似性を確認しやすくなります。

function :: (Ord a, Num a) -> a -> (b -> b) -> b -> b
function n f x
  | n > 0     = f (function (n-1) f x)
  | otherwise = x

これは、ポイントフリー と機能的に同等functionです。

Haskell では、関数は「 と a を取り、 aを返す関数」または「 an を取り、toから関数を返す関数f :: a -> b -> c」のいずれかとして解釈できます。関数を 1 つ以上の入力に適用する場合、各入力は関数の引数の 1 つを削除するものと考えてください。この場合、は type の新しい関数を返し、 typeの関数を返します。abcabcfunction 10(a -> a) -> a -> afunction 2 (*2)Num a => a -> a

このように考えるとfunction (-2) (*2) 1、数値をfunction 2 (*2)返すのに関数を返す理由が明確になるはずです。型キャストは行われません。3 つの引数functionを 2 つの入力に適用すると、値の計算に必要な最終的な入力を提供しなかったため、値の代わりに別の関数が返されます。

于 2013-05-31T11:25:54.880 に答える