2010-06-04 7 views
16

왜 하스켈에서 큰 튜플을 만들 수 없습니까? 튜플 크기 제한이있는 이유는 무엇입니까?하스켈 튜플 크기 제한

Prelude> (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) 

<interactive>:1:0: 
    No instance for (Show 
         (t, 
         t1, 
         t2, 
         ... 
         t23)) 
     arising from a use of `print' at <interactive>:1:0-48 
    Possible fix: 
     add an instance declaration for 
     (Show 
     (t, 
      t1, 
      t2, 
      ... 
      t23)) 
    In a stmt of a 'do' expression: print it 
+0

당신의 코드가 작동합니까? –

+12

물론 그렇습니다. 그런데 왜 그렇게 불평 할 수있을 때 오류 메시지를 읽으십니까? – jrockway

+2

GHC의 제안이 끔찍한 끔찍한 생각이 아닌 드문 경우 중 하나입니다. – luqui

답변

21

튜플은 임의 길이 * 일 수 있지만 표시, Eq, Ord, Read, Bounded 등은 최대 15- 튜플까지만 인스턴스화됩니다. Haskell 98 report §6.1.4에서 :

이 튜플의 크기에 상한은 없지만, 일부 하스켈 구현은 튜플의 크기를 제한하고, 더 큰 튜플과 관련된 인스턴스를 제한 할 수 있습니다. 그러나 모든 Haskell 구현은 Eq, Ord, Bounded, Read 및 Show 인스턴스와 함께 최대 크기 15의 튜플을 지원해야합니다. 전주곡과 라이브러리는 다른 사람들이 당신이 24 튜플을 필요로하는 경우, 당신은 더 나은 데이터 구조를 사용한다 말했듯이 7

의 크기까지 튜플 우편으로 튜플 기능을 정의합니다.


편집 : * GHC 6.12.2의 같은 튜플의 최대 크기는 62 :

당신이 그것을 위해 쇼 인스턴스를 정의하는 경우
Prelude> :t (1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8) 

<interactive>:1:0: 
    A 64-tuple is too large for GHC 
     (max size is 62) 
     Workaround: use nested tuples or define a data type 
+0

GHC가 튜플을 60 가지 요소로 제한한다고 생각하지만 언어 표준은 그렇지 않습니다. 어느 쪽이든, 그 큰 튜플을 갖는 것은 바보예요. – copumpkin

+0

@ pumpkin : 아 맞아요. 업데이트 됨. – kennytm

10

더 큰 튜플을 구성 할 수 있지만 직접 정의해야합니다. 둘째, Show 인스턴스가 없으므로 인스턴스를 작성해야합니다.

일반적으로 벡터와 같이 더 똑똑한 데이터 형식을 사용해야하는 경우 큰 튜플을 사용하는 것은 좋지 않습니다. 기본적으로 제공되는 크기를 제한하여 사용하지 않는 것이 좋습니다.

22

많은 사람들이 하스 켈러 (Haskellers)에게 슬퍼했으며 튜플은 구성 적이 아닙니다. 따라서 모든 튜플은 튜플의 모든 크기에 대해 정의되어야합니다. 나는 그 보고서가 인스턴스가 10 인분 또는 그와 비슷한 것으로 정의 될 필요가 있다고 말하고 있다고 생각합니다.

나는 실제로 3 배 이상을 사용하지 않습니다. 튜플을 사용하여 일종의 유형 수준 논리를 수행하는 경우 구성 변형을 작성한 다음 대신 사용하십시오. 예를 들어 :

infixr 9 :* 
data a :* b = a :* !b 

는 다음 INT의 5ple의 유형은 다음과 같습니다

Int :* Int :* Int :* Int :* Int :*() 

끝에 단위 ()는 엄격 정확성뿐만 아니라 식 레벨 로직 중요하다 (당신이 같으면 ' 마지막 요소를 엄격하게하고 다른 모든 요소를 ​​게으 르기를 원한다.)

선언의 강약에 유의하십시오. 이는 튜플의 오른쪽이 엄격하다는 것을 의미하므로 위의 다섯 개 유형을 단일 메모리 덩어리로 단순화하여 나중에 요소가 이전 요소보다 액세스 비용이 비싸지 않도록 할 수 있습니다.

+0

당신의'(: *)'은 제 쿼티 쿼터를 구현하는데 좋습니다. 인용문은 다양한 유형을 반환하는보기 패턴에서 반환 정보를 전달하기 위해 임의로 큰 튜플 (사용자에 따라 다름)이 필요합니다. 중첩 튜플보다 훨씬 좋습니다. –

+0

하지만 (a : * b) : * c는 a : * (b : * c)와 동일하지 않습니까? 표기법과 엄격함을 제외하고는 중첩 된 튜플과 같습니다. – saolof