読者です 読者をやめる 読者になる 読者になる

Haskellを触って見る続き

Haskell

とりあえずさしあたっての目標に前のエントリに書いたようにラボユース成果物(haru2036/laboyouth · GitHub)をHaskellに移植することを設定したので、とりあえずモデルの生成部分からやっていこうと思ってます。まあいきなりtrigramの数え上げやったら死ぬと思ったので、さしあたりunigramの数え上げからやっていこうと思ってます。
そんなこんなでとりあえず一つの単語に付いて何回出現するかを調べる関数を作ったのですが、なんかよくわからんことに。

countUnigram :: String -> [String] -> Int

countUnigram key items = length $ takeWhile (==key) items

main = return $ countUnigram "a" ["a", "a", "ba", "bb", "ab", "a"]

こんなコードを書いて実行すると

2

とか出てきました。ひとつ足りなくね?と思って検索対象(一つ目の引数)を"ab"にしたところ0と……じゃあ存在しない場合どうするのよと思って"cc"をしても0が帰ってきます、どういうこっちゃ。takeWhileがそういう感じなのかそれとも……

(たぶん)つづきます

    • 追記--

ありがたいことにTwitterですぐツッコミをもらったので。


とのことでtakeWhileをfilterに置き換えたらうまくいきました。
当初参考にしていたページ
Haskell のリスト操作 : tnomuraのブログ
にもtakeWhileとfilter両方乗ってたけどうっかりfilterを見落として書いてしまってたみたいで。
そこをもう一度見たら

条件に合う要素をリストの先頭から取り出す。条件が合わなくなったところで処理は終了する。
Hugs> takeWhile (<4) [1,2,3,4,5]

てて書いてありました。さいしょのa2つの次にbaが入ってたのでそこで終了しちゃってたみたいな。
ありがとうございます!

つづきました