あなたは何が起こっていることを理解する必要があります等号の左側にある関数の定義は「パターンマッチング」です。あなたは基本的に私は最初のパラメータとして、すなわちa
、任意の型の要素を受け入れるように最初、2番目のパラメータとして空のリスト、すなわち[]
たい
func a [] = a
...
を言っている次の文では
、 。その場合、a
を返すことにします。問題は、あなたがリスト[a]
を返そうとしていることです(あなたはこの答えの後半に理由を見るでしょう)。
関数定義の2番目の部分(これは、最初の "パターン"が入力と一致していないことを意味します)は、次のように言います:任意の型の要素、つまりa
と空でないリストすなわち、(x:xs)
。 (x:xs)
は言うことができます:はい、私はリストを持っており、x
はそのリストの最初の要素です。リストの残りの部分はxs
と呼ばれ、空でもかまいません。その場合、元のリストはサイズ1のリストになります。つまり、ちょうど[x]
です。どのようなパターンが一致した場合は、返却すると、あなたが二番目のパラメータ(すなわちx
)として渡されたリストの最初の要素を取り、それを先頭に追加していることを意味し
... = x : func a (x:xs)
ある
...
func a (x:xs) = x : func a (x:xs)
func a (x:xs)
の結果です。
func a [] = [a]
func a (x:xs) = x : func a xs
私はここに二つのことを注意したいと思います:あなたのこの問題の説明を考えると
、ここでの可能な解決策です。最初のパターン、つまりfunc a [] = [a]
では、リスト、つまり[a]
が返されます。第2のパターンでは、私はxs
をfunc
に、すなわちfunc a xs
に渡します。どちらの場合も、私はリストを返します!
これはなぜ機能しますか?例を見てみましょう。例えば、func
をfunc 3 [1, 2]
のように呼んだとします。そして、これが起こります。
[1, 2]
は空のリストではないので、最初のパターンと一致しないので、2番目のパターンを見てみましょう。はい、私たちは2番目のものとマッチします。今度はa = 3
,x = 1
(リストの先頭)とxs = [2]
があります。そこで、我々は1 : func 3 [2]
を持っています。だから我々は繰り返す!現在、a = 3
(前と同じ)、x = 2
およびxs = []
(つまり空のリスト)があります。そこで関数本体を進め、2 : func 3 []
を実行します。最後にfunc 3 []
が最初のパターンと一致し、[3]
を返します。しかし何に?さて、2 : [3]
には、何に戻る? 1 : 2 : [3]
に。
リストの最後に項目を追加するのは良い練習ですが、通常は本物のHaskellプログラムで行うべきではありません。それは高価で、間違った順序でリストを構築していることを示します。通常、より良いアプローチがあります。 – amalloy
それは大学のための唯一の練習です:) – Darius