Haskell 99問より、1ー10問。Haskell のプログラミングがアルゴリズムそのものを記述するという雰囲気がわかる。したがって、プログラミングがどこかパズル風になるのが面白い。
http://www.haskell.org/haskellwiki/99_questions/1_to_10 から引用。 第1問 リストの最後の要素を取得する関数を作れ。 解答 mylast :: [a] -> a mylast [x] = x mylast (x:xs) = mylast xs 第2問 リストの最後から2番目の要素を取得する関数を作れ。 解答 last1 :: [a] -> a last1 [x,_] = x last1 (x:xs) = last1 xs 第3問 リストの n 番目の要素を取得する関数を作れ。 解答 elementAt :: [a] -> Int -> a elementAt (x:_) 0 = x elementAt (_:xs) n = elementAt xs (n-1) 第4問 リストの要素数を取得する関数を作れ。 解答 myLength :: [a] -> Int myLength [] = 0 myLength (x:xs) = 1 + myLength xs 第5問 リストの要素を逆順にしたリストを作る関数を作れ。 解答 myReverse :: [a] -> [a] myReverse = foldl (flip (:)) [] 第6問 リストが回文(例:たけやぶやけた)であるかどうかを判別する関数を作れ。 解答 isPalindrome :: (Eq a) => [a] -> Bool isPalindrome xs = xs == reverse xs 第7問 階層構造のリストを一次元リストに変換する関数を作れ。ただし、Haskell ではリストの要素は同じ型でなければならないので、['a',['b','c']] のようなリストは型エラーとなる。階層構造のリストの型を定義する必要がある。 実行例 *Main> flatten (Elem 5) [5] *Main> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]]) [1,2,3,4,5] *Main> flatten (List []) [] 解答 data NestedList a = Elem a | List [NestedList a] flatten :: NestedList a -> [a] flatten (Elem x) = [x] flatten (List x) = concatMap flatten x 第8問 リストから重複した要素を取り除く関数を作れ。 実行例 *Main> compress ['a','a','a','a','b','c','c','a','a','d','e','e','e','e'] ['a','b','c','a','d','e'] 解答 import Data.List compress :: (Eq a) => [a] -> [a] compress = map head . group 第9問 リストの重複した要素をサブリストにまとめる関数を作れ。 実行例 *Main> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', 'a', 'd', 'e', 'e', 'e', 'e'] ["aaaa","b","cc","aa","d","eeee"] 解答 pack :: (Eq a) => [a] -> [[a]] pack (x:xs) = let (first, rest) = span (==x) xs in (x:first) : pack rest pack [] = [] 第10問 リストの重複した要素を調べ、(重複数、代表要素)のタプルを要素とする関数を作れ。 実行例 encode "aaaabccaadeeee" [(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')] 解答 import Data.List encode :: (Eq a) => [a] -> [(Int,a)] encode xs = map (\x -> (length x, head x)) (group xs)
by tnomura9
| 2009-08-13 00:04
| Haskell
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||