2012-08-10 30 views
7

是微不足道的重新定義函數(())是如何在內部定義的?

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

怪異的(對我)的事情是,這個功能是任意長度元組定義。因此,例如,實際上有一個功能:

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

這是如何完成的?爲什麼沒有爲所有的元組標準函數完成,比如zip?

Hoogle給我no results,我沒有看到Haskell如何做到這一點,所以我認爲它必須是編譯器內部的某種魔力。但對我來說,這看起來非常不合時宜。

+1

你現在應該回你的問題了。 – 2012-08-10 22:48:16

+1

非常非Haskelly,但是是真的。 – augustss 2012-08-11 04:51:13

回答

6

這是如何完成的?

編譯器支持。 Haskell語言報告強制要求(,)至少支持15個參數(6.1.4),但GHC會進一步進一步生成更多(上次我們測試過它,它可以處理數百甚至數千)。 zip和其他元組函數必須爲最多7元組定義。我不知道GHC是否會生成更大數量的產品。

+1

「數百乃至數千」< - 真的嗎? GHC 7.4.1報告'對於GHC,63元組太大(最大值爲62)解決方法:當我嘗試時使用嵌套元組或定義數據類型。 – 2012-08-11 01:15:46

+0

爲什麼是62? 64(2^6)會更有意義。任何人都知道額外2的目標是什麼? – 2012-08-11 02:33:04

+2

Typechecker在某些設置中具有指數時間。由於它有些類沒有爲長元組定義,請參閱ghc-prim的GHC.Tuple源代碼。 – permeakra 2012-08-11 04:38:11

2

我的理解是,(,)不是一個常規函數,它是一個具有特殊語法的構造函數,用於連接到langage。它類似於語法[1, 2, 3],你不能自己定義它,因爲它是硬連線的。

2

它在語言定義中指定並硬編碼到編譯器中。你沒有在Haskell中定義元組,Haskell的定義包括元組。

元組的接受(,,,)語法是匿名產品類型,這是非常基礎的。由於每個組件都存在並且可以推斷,因此這些與類型推斷也非常相似。

對於匿名求和類型沒有可接受的語法,並且它們可能無法與類型推理一起玩。

Haskell提供用戶可定義的中綴語法,但不包括用戶可定義的括號(在廣泛的準引用可能性之外)。

相關問題