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ď č. 1Ako 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).