BiGramのOCaml実装
>あー Map 使うのか。そういえばそんなものもあったなぁ。成程。
>
>以下、思うこと。
>
if mem tbl key then
replace tbl key (func(find tbl key))
else
add tbl key def > >string を変換して char list に仕立て、 combine (zipと同じ)を利用する方法もあるが、たぶん激しく遅くなる。といっても、おそらく for が最速なのは変わらなくて、他にどんな方法を使っても遅いことに変わりはない。ならアルゴリズムの見通しを良くするために list でもいいか、という話はある。 > >どっちかというと、むしろ String.iter を定義しておいて、 > >let bigram s =
let c = ref '\000' in
let h = Hashtbl.create (String.length s) in
String.iter (fun c' -> if !c != '\000' then update h (!c, c') 1 ((+) 1); c := c') s > >のように参照を使うのが OCaml 式かも。 String.iter じたいは for で実装しようが何しようが感知しないわけで。 > >ただもちろん、↑のコードでは文字列の中にヌル文字が含まれるようなものはうまく行かないので問題。本当は option を使うんだろうけれど、 option はこういう場合には面倒なので略した。 Haskell みたいに Maybe がモナドだと楽なんだろうけれどね。いちおう昨日紹介した ExtLib の >Option > モジュールがあれば、もうちと綺麗に書けるか。 >
if mem tbl key then
replace tbl key (func(find tbl key))
else
add tbl key def > >string を変換して char list に仕立て、 combine (zipと同じ)を利用する方法もあるが、たぶん激しく遅くなる。といっても、おそらく for が最速なのは変わらなくて、他にどんな方法を使っても遅いことに変わりはない。ならアルゴリズムの見通しを良くするために list でもいいか、という話はある。 > >どっちかというと、むしろ String.iter を定義しておいて、 > >let bigram s =
let c = ref '\000' in
let h = Hashtbl.create (String.length s) in
String.iter (fun c' -> if !c != '\000' then update h (!c, c') 1 ((+) 1); c := c') s > >のように参照を使うのが OCaml 式かも。 String.iter じたいは for で実装しようが何しようが感知しないわけで。 > >ただもちろん、↑のコードでは文字列の中にヌル文字が含まれるようなものはうまく行かないので問題。本当は option を使うんだろうけれど、 option はこういう場合には面倒なので略した。 Haskell みたいに Maybe がモナドだと楽なんだろうけれどね。いちおう昨日紹介した ExtLib の >Option > モジュールがあれば、もうちと綺麗に書けるか。 >