-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
タプルって要素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,2,3]→1 : (2 : (3 : []))(ポインタ3つ) - タプル
(1,2,3)→ 連続メモリ (ポインタなし)
- リスト
-
型安全性:
[1, 2, 3, 4] -- [Int] 型(要素数不明) (1, 2, 3) -- (Int, Int, Int) 型(要素数3と確定)
-
パターンマッチの明確性:
-- リストだと長さチェックが必要 solve [a, b, c] = ... -- 3要素以外でもマッチしてしまう可能性 -- タプルは型で長さが保証される (a, b, c) = (1, 2, 3) -- 必ず3要素
ただし今回は:
patterns の要素を数えるだけなので、実際の性能差はほぼありません。リスト [[a,b,c]] でも問題ないです。タプルの方が「3つ組」という意図が明確になる程度の違いです。
Metadata
Metadata
Assignees
Labels
No labels