Open5
Codewars 演習記録 in Haskell
<8 kyu> Multiply
2つの数を引数に取る乗算関数
multiply
を定義せよ。
題意はどちらかというと「そのままの状態だとうまく動作しないから、解答する言語仕様に合うように直してね」という感じで、Codewars ではチュートリアル的な問題として有名?
2つ解答してみた。個人的には2つ目の方が Haskell っぽくて好き。
解答例1(仮引数を置くパターン)
multiply :: Int -> Int -> Int
multiply a b = a * b
解答例2(ポイントフリースタイル)
multiply :: Int -> Int -> Int
multiply = (*)
<8 kyu> Convert a String to a Number!
数値としてパース可能な文字列を数値型に変換する関数
stringToNumber
を作成せよ。ただし与えられる文字列は負数も含み、かつ常に数値として有効な文字列のみが与えられるものとする。
💡Hint: show
の逆っぽいことをやるには…?
解答例1(返り値の型を指定するパターン)
stringToNumber :: String -> Integer
stringToNumber s = read s :: Integer
解答例2(関数の型を指定するパターン)
stringToNumber :: String -> Integer
stringToNumber = read :: String -> Integer
型指定せず単に read
でもイケるっぽい。その場合の変換先の方は自動で推論される…?
解答例3(返り値の型を推論させるパターン)
stringToNumber :: String -> Integer
stringToNumber s = read s + 0
<7 kyu> Waiting room
題意要約:
ある待合室には 1 から n までの番号が振られた n 脚の椅子が置かれていて、利用者は以下のルールに従って順番に席に座っていく。
- 既に座っている人からなるべく距離(間隔)の空いた椅子に座る
- 他の人との間隔が同じ席が複数ある場合、その中で入り口に近い(=番号の若い)椅子に座る
椅子の数
n
(> 2) を引数として、この待合室が満席となるときに最後に埋まる席番号を返す関数lastChair
を実装せよ。
Rust で解いたとき の思索を経ているので、求める計算結果は分かっている。さて、Haskell ではどう書こうか?
解答例
せっかくなので Int
が Ord
型のクラスであることを利用したポイントフリースタイルで書いてみた。succ
の逆は pred
だそうです。
lastChair :: Int -> Int
lastChair = pred