2017-04-20 14 views
3

ハスケル初心者はこちら。引数の数に関してzipが一般的でないのはなぜですか?

  • zipzip3は重要な機能です - ザ・は(移調)と

  • ジェネリックない数学の一般的な操作を表し、他の多くの言語で実装され、プレリュードには含まれています。これは、というのが私の観察でありますパラメータ構造に関して、

  • 伝統的な言語(C言語またはC++)で簡単に実装できます。 pythonは既にビルドインとして持っています

zipはなぜ制限されていますか?それを一般化した抽象化はありますか? nサイズのタプルで何か問題がありますか?

+0

https://stackoverflow.com/questions/2468226/how-to-zip-multiple-lists-in-haskell https://stackoverflow.com/questions/39991581/how-can-i-implement-generalized- zipn-and-unzipn-in-haskell https://stackoverflow.com/questions/40342060/convert-a-tuple-of-lists-of-the-same-length-to-a-list-of-tuples-for -arbitrary –

+0

https://stackoverflow.com/questions/7828072/how-does-haskell-printf-work –

+0

@JoshLeeリンクに感謝します。秒は1に近づきますが、敷居は私に多くの苦難を残します1)固定n = 2の標準実装はなぜですか2)リストの数を渡す必要があります、それは扱いにくい3)自分のzipを定義してもPrelude.zipとの衝突が発生します。 – Vorac

答えて

6

提案された複製がこれのほとんどに答えているので、あなたのフォローアップのコメントに質問に焦点を当てます。

1)なぜ固定するための標準的な実装がn = 2

zipWith 2つの引数のためであり、repeatは0引数のためのものです。これは任意のジタルを得るのに十分です。例えば、(またmap呼ばれる)1つの引数バージョンはそうで

zipWith3 f = (.) (zipWith ($)) . zipWith f 

として

map f = zipWith ($) (repeat f) 

および3引数バージョンとして実装することができます。より大きなzipの実装にはかなりのパターンがあります(この小さなサンプルサイズからはっきりと分かりません)。この結果は、0-aryおよび2-ary製品のカテゴリにすべての主要製品が含まれているというCTの結果と似ています。

答えの残りの半分は、タイプ・レベルの数値(任意のジタル・ジップの最も頻繁な実装手法)は可能ですが使用するのは面倒ですが、それらを避けると、およびタイプレベルのノイズが含まれます。

2)私はリストの数を渡す必要があり、それは

使用ZipList扱いにくいです。あなたはリストの数を渡す必要はありません(リストごとに1つの中置演算子を書く必要がありますが、非常に軽い要件ですが、Pythonでも各リストの間にカンマが必要です)。

経験的に:私はそれを「扱いにくい」とラベル付けするような一般的な必要性のような恣意的なジップを見つけられませんでした。

3)私自身のジップを定義しても、Prelude.zipとの衝突が発生します。

だから別の名前を選んでください...?型シグネチャが異なることになるので

1

、例えばジップとzip3の型シグネチャが異なる:

zip :: [a] -> [b] ->[(a,b)]

zip3:: [a] -> [b] -> [c] -> [(a,b,c)]

zip3zipよりも1つの以上の引数を取り、第二タイプ、 haskellでは、カレー化のために異なる数の引数を持つ多型を持つことができません。 Hereは、どのようなカリングがあるかの説明です。

関連する問題