LoginSignup
6
6

More than 5 years have passed since last update.

Haskellドリル(リスト編)

Last updated at Posted at 2014-10-13

課題1

指示

リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いること。

Prelude> myLast [1, 2, 3, 4]
4

ヒント

リストの最初の要素を取得する myHead を示す。

myHead          :: [a] -> a
myHead          = f where
    f []        = error "No head for empty list"
    f (x : _)   = x

課題の狙い

  • 再帰を用いたリスト処理の書き方を学ぶ。
  • 型宣言の読み方を学ぶ。
  • パターンマッチの仕方を学ぶ。
  • error 処理の読み方を学ぶ。

解答例

解答例

課題2

指示

リストの最後の要素を取得する関数 myLast を作れ。
ただし、再帰を用いず、Prelude にある関数を合成して作成すること。

Prelude> myLast [1, 2, 3, 4]
4

ヒント

  • HoogleではHaskellの様々な関数を検索できる。Hoogle では関数名だけではなく、関数の型宣言でも検索することができる。例えば、 [a] -> a と入力して検索すると head 関数などを検索結果として得ることができる。

  • 今回の関数は「リストを逆転し、そのリストの最初の要素を取得する」と考える。

課題の狙い

  • 関数合成を学ぶ。
  • Hoogle の使い方を学ぶ。

解答例

解答例

課題3

指示

リストの n 番目の要素を取得する関数 myIndex を作れ。

Prelude> myIndex [1, 2, 3, 4] 2
2
Prelude> myIndex [1, 2, 3, 4] 3
3

ヒント

  • パターンマッチは2つの引数を取ることもできる。
  • パターンマッチした後の変数を利用して「条件分岐」に似たことができる「ガード」を利用する。

課題の狙い

  • 2引数の関数の型宣言を学ぶ。
  • 2引数のパターンマッチを学ぶ。
  • ガードの使い方を学ぶ。

解答例

解答例

課題4

指示

与えられた文字列を全て大文字に変える関数 myUpper を作れ。

Prelude> myUpper "aBcDeFghi"
ABCDEFGHI

ヒント

  • 1文字だけを大文字に変える関数 toUpper がある。
  • 文字列は Char 型のリストのことである。

課題の狙い

  • 高階関数を学ぶ。

解答例

解答例

課題5

指示

与えられた整数リストのうち、奇数だけの合計値を求めるoddSumを作れ。
ただし、foldlfilterを合成して作成すること。

Prelude> oddSum [1,2,3,4,5,8,9,11]
29

課題の狙い

  • リスト操作の基本的な関数を学ぶ。

解答例

解答例

課題6

指示

与えられたテキストファイルに行番号を付与する関数 lineNum を作れ。
ただし、行番号の桁揃えなどは行わなくて良い。

ヒント

以下のソースの lineNum を実装する。

main    = getContents
        >>= return . lines
        >>= return . lineNum
        >>= return . unlines
        >>= putStrLn

lineNum     :: [String] -> [String]
lineNum     = f where
    f sts   = sts

実行方法

$ ghc lineNum.hs
[1 of 1] Compiling Main             ( lineNum.hs, lineNum.o )
Linking lineNum ...
$ .lineNum < lineNum.hs
1 main    = getContents
2         >>= return . lines
3         >>= return . lineNum
4         >>= return . unlines
5         >>= putStrLn
6 
7 lineNum         :: [String] -> [String]
8 lineNum         = f where
9     f sts       = sts

課題の狙い

  • Haskell のコンパイル方法を学ぶ。
  • main の書き方を知る。
  • 2つのリストをまとめて処理する方法を学ぶ。
  • 文字列への変換方法を学ぶ。
  • ポイントフリーの書き方を学ぶ。
  • 無限リストを学ぶ。

解答例

解答例

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6