6

関数を再定義するのは簡単です

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

(私にとって)奇妙なことは、この関数が任意の長さのタプルに対して定義されていることです。したがって、たとえば、実際には次の関数があります。

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

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

Hoogle からは何の結果も得られず、テンプレート Haskell でこれがどのように行われるのかわかりません。そのため、これはコンパイラ内の何らかの魔法に違いないと思います。しかし、それは私には非常にハスケリーではないようです。

4

3 に答える 3

5

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

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

于 2012-08-10T23:08:31.470 に答える
1

私の理解では、それ(,)は通常の関数ではなく、言語に組み込まれた特別な構文を持つコンストラクターです。[1, 2, 3]これは、組み込みであるため自分で定義できないsyntax に似ています。

于 2012-08-12T11:05:57.357 に答える
1

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

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

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

Haskell は、ユーザー定義可能な中置構文を提供しますが、ユーザー定義可能な括弧は提供しません (広範な準引用の可能性を除く)。

于 2012-08-12T15:45:33.907 に答える