Skip to content

listとtupleの違いを確認する #32

@RyosukeDTomita

Description

@RyosukeDTomita

タプルって要素2つしかもてないんじゃないの?

いいえ、Haskellのタプルは2つ以上の要素を持てます!

-- 2要素(ペア)
(1, 2) :: (Int, Int)

-- 3要素(トリプル)
(1, 2, 3) :: (Int, Int, Int)

-- 4要素
(1, 2, 3, 4) :: (Int, Int, Int, Int)

-- 5要素以上も可能
(1, 2, 3, 4, 5) :: (Int, Int, Int, Int, Int)

用語:

  • 2要素タプル: ペア (pair)
  • 3要素タプル: トリプル (triple)
  • n要素タプル: n-タプル (n-tuple)

ただし、標準ライブラリの便利な関数(fst, snd)は2要素タプル専用です:

fst (1, 2)     = 1  -- OK
snd (1, 2)     = 2  -- OK
fst (1, 2, 3)  -- エラー!3要素タプルには使えない

今回のコードでは (a, b, c) という3要素タプルを使っていますが、単に個数を数えるだけなので問題ありません。

タプルとリストの違いとメリット:

リスト [a, b, c]:

  • 同じ型の要素を可変個格納
  • 型: [Int] (長さは型に現れない)
  • 実行時まで長さが確定しない
  • メモリ: 連結リスト構造(ポインタのチェーン)

タプル (a, b, c):

  • 異なる型の要素を固定個格納
  • 型: (Int, Int, Int) (長さが型に現れる)
  • コンパイル時に長さが確定
  • メモリ: 連続したメモリ領域(直接アクセス)

今回のケースでのメリット:

  1. メモリ効率:

    • リスト [1,2,3]1 : (2 : (3 : [])) (ポインタ3つ)
    • タプル (1,2,3) → 連続メモリ (ポインタなし)
  2. 型安全性:

    [1, 2, 3, 4]  -- [Int] 型(要素数不明)
    (1, 2, 3)     -- (Int, Int, Int) 型(要素数3と確定)
  3. パターンマッチの明確性:

    -- リストだと長さチェックが必要
    solve [a, b, c] = ...  -- 3要素以外でもマッチしてしまう可能性
    
    -- タプルは型で長さが保証される
    (a, b, c) = (1, 2, 3)  -- 必ず3要素

ただし今回は:
patterns の要素を数えるだけなので、実際の性能差はほぼありません。リスト [[a,b,c]] でも問題ないです。タプルの方が「3つ組」という意図が明確になる程度の違いです。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions