2

私は特に関数型プログラミングと Haskell が初めてで、as-pattern とそれを使用することによる重複の削減について 2 つの質問があります。次のコード例を示します。

last1 :: [a]          ->  a
last1    [x]          =   x
last1    (x:xs)       =   last xs

last2 :: [a]          ->  a
last2    [y]          =   y
last2    (y:ys@(_:_)) =   last ys

last1と比較して重ならないようにする必要がありますlast2。特定の String を見てみましょうf:[][x]とに一致し(x:xs)ますlast1

last2一致し[y]ます。ただし(y:ys@(_:_))ys一致する(_:_)必要があり、最初の任意のパターンを[].

私の仮定は正しいですか?

次に、特定の String を見てみましょうf:o:o:[]。これでパターンが(y:ys@(_:_))一致しました。この場合、バインディングがどのように機能するのか興味があります。ys最初の呼び出しの後は何ですか? だと思いo:o:[]ます。

4

2 に答える 2

3

あなたの再帰は、 /lastではなく、両方のケースで行われます。last1last2

last1と比較して重ならないようにする必要がありますlast2。特定の String を見てみましょうf:[][x]とに一致し(x:xs)ますlast1

一致する可能性(x:xs)はありますが、パターン マッチングは最初の成功にしか一致しないため、一致しません。この点で重複はあいまいではありません (最初の定義が常に使用されます)。

last2一致し[y]ます。ただし(y:ys@(_:_))ys一致する(_:_)必要があり、最初の任意のパターンを[].

あなたの言い回しは少し奇妙ですが、後者は基本的に一致しないものとf:[]一致するため、一致できないことは正しいです。(y:ys@(_:_))_:_:_

次に、特定の String を見てみましょうf:o:o:[]。これでパターンが(y:ys@(_:_))一致しました。この場合、バインディングがどのように機能するのか興味があります。ys最初の呼び出しの後は何ですか? だと思いo:o:[]ます。

ys等しいo:o:[](または"oo"または[o,o])。

于 2015-05-21T22:34:47.633 に答える
0

最初のマッチング式が使用されるため、Haskell では両方の関数が同じです。2 番目の関数はそれについてもう少し明示的ですが、最初の関数はより慣用的です。

于 2015-05-21T22:35:40.013 に答える