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)
動的に自動生成されるらしい。