課題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
を作れ。
ただし、foldl
とfilter
を合成して作成すること。
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つのリストをまとめて処理する方法を学ぶ。
- 文字列への変換方法を学ぶ。
- ポイントフリーの書き方を学ぶ。
- 無限リストを学ぶ。