SSブログ

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 の標準ライブラリがこういう仕様を選んだのは何か理由があるんだろうか?


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。