Workshop/StartHaskell2/exercise3
「関数の構文」練習問題
##論理演算
論理演算の関数をパターンマッチを使って実装してみよう。
myNot :: Bool -> Bool
myAnd :: Bool -> Bool -> Bool
myOr :: Bool -> Bool -> Bool
myXor :: Bool -> Bool -> Bool
実行例
うるう年
うるう年を判定する関数を書いてみよう。
- 西暦年が4で割り切れる年はうるう年
- ただし、西暦年が100で割り切れる年はうるう年でない
- ただし、西暦年が400で割り切れる年はうるう年
実行例
FizzBuzz
FizzBuzz関数を実装してみよう。
実行例
ヒント: IntをStringに変換するには show関数を使います。
caseとifを使わない
次の関数からcaseとifを取り除いてみましょう。
analysisLine :: String -> String
analysisLine s =
case s of [] -> "empty"
[_] -> "a character"
s' -> if last s' == '.'
then "a sentence"
else if ' ' `elem` s'
then "some words"
else "a word"
ヒント: パターンマッチとガードを使います。
シーザー暗号
与えられた文字列をシーザー暗号で暗号化する関数を作成しよう。
- a~z の文字は、指定された数だけ右へずらす、ただし z の次は a に戻る
- A~Z の文字は、指定された数だけ右へずらす、ただし Z の次は A に戻る
- それ以外の文字や記号や空白は、ずらさない
実行例
ghci> caesar 1 "Hello, world!"
"Ifnmp, xpsme"
ghci> caesar 10 "(^o^) <`v`> ['-'] {~<~} |T_T|"
"(^y^) <`f`> ['-'] {~<~} |D_D|"
上の関数を使って、以下のシーザー暗号を解読できますか。
Par Yngvmbhgte Ikhzktffbgz Ftmmxkl
短い文字数でかけたら、あなごるに投稿しよう。
パターンマッチの網羅
以下のソースコードをGHCiに読み込んでみて、警告がでるかどうか試してみましょう。 (p.37)
{-# OPTIONS -Wall -Werror #-}
charName :: Char -> String
charName 'a' = "Albert"
charName 'b' = "Broseph"
charName 'c' = "Cecil"
警告がなくなるようにcharName関数を修正しましょう。
- ここに問題を追加