/ / Ako je (,) definované interne? - Haskell

Ako je () definovaný vnútorne? - haskell

Je triviálne predefinovať túto funkciu

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

Zvláštne (pre mňa) je, že táto funkcia je definovaná pre n-tice ľubovoľnej dĺžky. Napríklad, v skutočnosti existuje nejaká funkcia:

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

Ako sa to robí? Prečo to nie je možné pre všetky štandardné funkcie na n-tice, ako napríklad zips?

Hoogle mi dáva žiadne výsledky, a ja nevidím, ako by to mohla šablóna Haskell urobiť, takže predpokladám, že to musí byť nejaký kúzlo vo vnútri kompilátora. Zdá sa mi však, že to nie je úplne Haskelly.

odpovede:

6 pre odpoveď č. 1

Ako sa to robí?

Podpora prekladača. Mandáty správy jazyka Haskell (,) byť podporovaný najmenej 15 argumentmi (6.1.4), ale GHC ide o kúsok ďalej a generuje ich omnoho viac (pri poslednom testovaní to zvládlo stovky alebo dokonca tisíce). zip a ďalšie n-tice funkcie musia byť definované až pre 7-n-tice. Neviem, či GHC tieto generuje pre väčšie množstvá.


2 pre odpoveď č. 2

Moje chápanie je to (,) nie je to bežná funkcia, je to konštruktor so špeciálnou syntaxou, pevne zapojený do jazyka. Je to podobné ako v syntaxi [1, 2, 3], ktoré si nemôžete sami definovať, pretože sú pevne zapojené.


2 pre odpoveď č. 3

Je špecifikovaný v definícii jazyka a pevne zapojený do kompilátora. V Haskell nedefinujete n-tice, definícia Haskellu obsahuje n-tice.

Pre n-tice je akceptovaná (,,,) syntax, ktorású anonymné typy výrobkov, ktoré sú celkom zásadné. Tieto tiež dobre hrajú s odvodením typu, pretože každá zložka je prítomná a dá sa odvodiť.

Neexistuje žiadna akceptovaná syntax pre typy anonymných súm a nemusia sa dobre hrať pri odvodení typu.

Haskell ponúka užívateľom definovateľnú syntax infixu, ale nie zátvorky definované používateľom (mimo širokých možností kvázikritácie).