Haskellのタプルの秘密

突然思い付いたのでやってみた。

Prelude> :t (,)
(,) :: a -> b -> (a, b)
Prelude> (,) 1 2
(1,2)

うわ、やっぱりだ!


しかし冷静に考えると、これだと「(1, 2, 3)」がうまく機能しないように思える。
(「( (1, 2), 3)」か「(1, (2, 3) )」になってしまうように思える)
また、「1 + 2」は通るけど「1 , 2」は通らない。やっぱ特殊な扱いなのか?

Prelude> :i (+)
class (Eq a, Show a) => Num a where
  (+) :: a -> a -> a
  ...
        -- Defined in GHC.Num
infixl 6 +
Prelude> :i (!!)
(!!) :: [a] -> Int -> a         -- Defined in GHC.List
Prelude> :i (,)
data (,) a b = (,) a b  -- Defined in GHC.Tuple
instance (Bounded a, Bounded b) => Bounded (a, b)
  -- Defined in GHC.Enum
instance (Eq a, Eq b) => Eq (a, b) -- Defined in Data.Tuple
instance (Ord a, Ord b) => Ord (a, b) -- Defined in Data.Tuple
instance (Read a, Read b) => Read (a, b) -- Defined in GHC.Read
instance (Show a, Show b) => Show (a, b) -- Defined in GHC.Show
Prelude> 1 + 2
3
Prelude> [0] !! 0
0
Prelude> 1 , 2

<interactive>:1:2: parse error on input `,'

追記: PHOさんにこれを教えてもらった。

Prelude> (,,) 1 2 3
(1,2,3)
Prelude> :t (,,)
(,,) :: a -> b -> c -> (a, b, c)
Prelude> :t (,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
(,,,,,,,,,,,,,,,,,,,,,,,,,,,,)
  :: a
     -> b
     -> c
     -> d
     -> e
     -> f
     -> g
     -> h
     -> i
     -> j
     -> k
     -> l
     -> m
     -> n
     -> o
     -> p
     -> q
     -> r
     -> s
     -> t
     -> u
     -> v
     -> w
     -> x
     -> y
     -> z
     -> t28
     -> t29
     -> t30
     -> (a,
         b,
         c,
         d,
         e,
         f,
         g,
         h,
         i,
         j,
         k,
         l,
         m,
         n,
         o,
         p,
         q,
         r,
         s,
         t,
         u,
         v,
         w,
         x,
         y,
         z,
         t28,
         t29,
         t30)

動的に自動生成されるらしい。