BiGram

改行とか非Ascii文字とか考えてません。

http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20050624#p01

なにも考えずに書くとこうなります。

module StringMap = Map.Make(String)

module BG = 
  (struct
     include StringMap
     let find_exists s i bg = 
       if (mem s bg) then (find s bg) else i
   end)

let bigram s =
  let rec bigram0 s i =
    if (i+1 < String.length s) 
    then
      let bg2 = bigram0 s (i+1) in
      let s2 = String.sub s i 2 in
	BG.add s2 ((BG.find_exists s2 0 bg2)+1) bg2
    else
      BG.empty
  in
    bigram0 s 0

let _ = 
  let bg = bigram "banana" in
    BG.iter (Printf.printf "%s:\t%d\n") bg

うは、なにこれ。かっこわるw。

Mapを定義して、String.subをぐるぐる回してるだけ。zipのzの字も出てきやがらねえ…Haskellはともかく、RubyとかPythonとかで書いたほうがかっこいいというのは…orz

しかし、こういうプログラムを書くと、自分がいかにプログラミングが下手かというのがわかってしまって、軽くへこむ。