tag:blogger.com,1999:blog-76550672307031307.post7070491884331296526..comments2024-03-28T21:14:12.667+09:00Comments on すぐに忘れる脳みそのためのメモ: Haskell で変数の更新を伴うインデックス付きループを再帰で置き換えるにはjutememohttp://www.blogger.com/profile/06093978596272258217noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-76550672307031307.post-91895386172963757452012-01-28T01:20:03.822+09:002012-01-28T01:20:03.822+09:00難しいので、ゆっくり読み直してみます。難しいので、ゆっくり読み直してみます。greenwind888http://greenwind888.blog.fc2.com/noreply@blogger.comtag:blogger.com,1999:blog-76550672307031307.post-50210111830539301122011-02-15T12:52:38.623+09:002011-02-15T12:52:38.623+09:00なるほど、予め文字の長さを計算しておいたものに対して、関数を定義するのですね。
ところで、words...なるほど、予め文字の長さを計算しておいたものに対して、関数を定義するのですね。<br />ところで、words 関数があるのをすっかり忘れてました。<br />はじめぱっと見たとき、「あれ、これどこで定義されてるのかな?」と思ってしまいました。 (+_+)<br />(cf. http://jutememo.blogspot.com/2008/10/haskell_26.html )jutememohttps://www.blogger.com/profile/06093978596272258217noreply@blogger.comtag:blogger.com,1999:blog-76550672307031307.post-50025863520004942792011-02-15T05:26:57.954+09:002011-02-15T05:26:57.954+09:00面白そうだったので、自分なりにコーディングしてみました。
モナドを使うのは苦手なので、単純に再帰...面白そうだったので、自分なりにコーディングしてみました。<br /><br /><br />モナドを使うのは苦手なので、単純に再帰関数を使ってみました。<br /><br />-- 再帰によるループ<br />longestWord :: String -> (String, Int)<br />longestWord cs = loop lst 0 ("", 0)<br /> where<br /> lst = [(length w, (w, i)) | (w, i) <- zip (words cs) [0..]]<br /> loop ((len', wi) : xs) len ans<br /> | len' > len = loop xs len' wi<br /> | otherwise = loop xs len ans<br /> loop _ _ ans = ans<br /><br /><br /><br />この記事の主旨からは離れると思ったのですが、ループを使わないバージョンも考えてみました。<br /><br />-- あえてループを使わない<br />longestWord2 :: String -> (String, Int)<br />longestWord2 cs = head [wi | (len, wi) <- lst, len == maxLen]<br /> where<br /> lst = [(length w, (w, i)) | (w, i) <- zip (words cs) [0..]]<br /> maxLen = maximum [x | (x, _) <- lst]<br /><br /><br /><br />最大長の文字列が複数あった場合、すべて返すバージョンも作ってみました。(longestWord2 から head を外しただけ…)<br /><br />-- 最大長の文字列を全部返す<br />longestWord3 :: String -> [(String, Int)]<br />longestWord3 cs = [wi | (len, wi) <- lst, len == maxLen]<br /> where<br /> lst = [(length w, (w, i)) | (w, i) <- zip (words cs) [0..]]<br /> maxLen = maximum [x | (x, _) <- lst]ツムジnoreply@blogger.com