2

Hutton の本、Programming in Haskell を読んでいます。ここに関数があります:

pairs :: [a] -> [(a,a)]

pairs xs = zip xs (tail xs)

例えば

>ペア [1,2,3,4]

>[(1,2),(2,3),(3,4)] --結果

この関数の読み方が問題?左から右へ?

「テール」が 1 つの要素を残し、「zip」を使用して次の要素と結合する方法がわかりません。「テール」はリストから残りのすべての要素を取得すると仮定しているためです

4

2 に答える 2

11

あなたが言及した本は読んだことがありませんが、知っていることを説明しようと思います。

tailリストの最初の要素を除くすべてを返す関数については正しいです。zip仕組みを見てみましょう。

zip [1, 2, 3, 4] [5, 6, 7, 8]

与える、

[(1, 5), (2, 6), (3, 7), (4, 8)]

ここで、入力から必要な出力を考え、入力から出力への必要な変換を観察します。

[1, 2, 3, 4] -> [(1,2),(2,3),(3,4)]

上記の の適用から、zip必要な出力は次のように呼び出すことで取得できることがわかりますzip

zip [1, 2, 3] [2, 3, 4]

ここで、functionのドキュメントzipから、指定された 2 つのリストの長さが等しくない場合、長い方のリストの余分な項目が破棄されることがわかります。したがって、同じ結果が得られます。

zip [1, 2, 3, 4] [2, 3, 4]

最初の入力リストの最後の4ものが破棄され、必要な結果が得られます。

これは、次のように関数で記述できます。

pairs xs = zip xs (tail xs)

他に何かご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-05-25T04:39:40.400 に答える