2012-08-10 15 views
7

それは(、)はどのように内部で定義されていますか?

(,) :: a -> b -> (a,b) 
(,) a b = (a,b) 

機能を再定義するために些細なのです(私には)奇妙なことは、この関数は任意の長さのタプルのために定義されていることです。たとえば、実際に関数があります。

(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,) :: a -> b -> c -> ... -> (a,b,c,...) 

これはどのようにして行われますか?なぜそれはzipのようなタプルのすべての標準関数に対して行われていないのですか?

Hoogleが私にno resultsを与えてくれて、テンプレートHaskellがこれを行う方法がわからないので、コンパイラ内部で何らかの魔法でなければならないと思います。しかし、それは私にとってハスケルではないようです。

+1

あなたの質問はもう戻ってください。 –

+1

非常に非ハスケルですが、真です。 – augustss

答えて

6

これはどのように行われますか?

コンパイラのサポート。 Haskellの言語レポートでは、少なくとも15個の引数(6.1.4)でサポートされるように(,)が要求されていますが、GHCはもう少し進んでより多くのものを生成します(これを最後にテストしたとき、 )。 zipと他のタプル関数を7タプルまで定義する必要があります。私は、GHCがより大量のものを生成するかどうかはわかりません。

+1

「何百、何千もの」< - 本当ですか? GHC 7.4.1では '63タプルがGHCには大きすぎます(最大サイズは62です)。回避策:ネストされたタプルを使用するか、データ型を定義します。 –

+0

なぜ62ですか? 64(2^6)の方がはるかに意味があります。いずれにしても、余分な2はどこに行くのですか? –

+2

いくつかの設定でタイプチェッカーは指数関数的な時間を持ちます。そのため、いくつかのクラスは長いタプルに対して定義されていません。ghc-primのGHC.Tupleのソースコードを参照してください。 – permeakra

2

私の理解では、(,)は通常の関数ではなく、特別な構文を持つコンストラクタであり、langageにハードワイヤードされています。これは構文[1, 2, 3]に似ています。ハードワイヤードなので、自分で定義することはできません。

2

これは言語定義で指定され、コンパイラに組み込まれています。あなたはHaskellでタプルを定義しません。Haskellの定義にはタプルが含まれます。

非常に基本的な匿名の製品タイプであるタプルの構文が受け入れられます(,,,)。これらは、各コンポーネントが存在し、推論することができるので、型推論にも完全に適しています。

匿名の合計型には受け入れられる構文はなく、型の推論ではうまく機能しない可能性があります。

ハスケルはユーザー定義可能なインフィクス構文を提供しますが、ユーザー定義可能な大括弧は使用できません(広義の疑似引用符の範囲外)。

関連する問題