Ocaml の List.combine と SML の ListPair.zip と Haskell の zip [OCaml]
2つのリストを引数にとって要素のペアのリストを返す関数というのが OCaml でも SML でも Haskell でも用意されている。でも OCaml だけ何か使い勝手が違うようだ。
SMLではこう書く:
- ListPair.zip ([1,2,3,4],[#"a",#"b",#"c",#"d"]); val it = [(1,#"a"),(2,#"b"),(3,#"c"),(4,#"d")] : (int * char) list - ListPair.zip ([1,2,3,4],[#"a",#"b",#"c"]); val it = [(1,#"a"),(2,#"b"),(3,#"c")] : (int * char) list
Haskell ではこう:
Prelude> zip [1,2,3,4] ['a','b','c','d'] [(1,'a'),(2,'b'),(3,'c'),(4,'d')] Prelude> zip [1,2,3,4] ['a','b','c'] [(1,'a'),(2,'b'),(3,'c')] Prelude>
そして OCaml ではこうなる:
# List.combine [1;2;3;4] ['a';'b';'c';'d'];; - : (int * char) list = [(1, 'a'); (2, 'b'); (3, 'c'); (4, 'd')] # List.combine [1;2;3;4] ['a';'b';'c'];; Exception: Invalid_argument "List.combine".
何が違うかというとつまり要素数が不揃いなリストを引数に与えた場合に SML と Haskell では小さいほうにあわせるけど OCaml では 例外を返すようになっているのだ。
Haskell だと片方が無限リストの場合こういう仕様じゃないと困る。でもそうでなくても小さいほうにあわせる仕様でしいて困ることはないように思える。
SML 風の zip 関数を作るのはささやかなことだが OCaml の標準ライブラリがこういう仕様を選んだのは何か理由があるんだろうか?
コメント 0