第3章おさらい
- パターンマッチ
- ガード
- asパターン
- where
Prelude> let xs = [(1,3),(4,3)] Prelude> [a+b | (a,b) <- xs] [4,7]
ガードはまたげるけどパターンマッチはまたげない
- let whereが文なのにたいしletは式なのでどこでも書ける
関数の構文に対しての説明
第4章 Hello 再帰!
再帰とは関数の定義の中で自分自身を呼び出す、という関数の定義の仕方のこと
- 自分自身を呼び出すパート
- 基底部(これ以上分解できなくて解を明示的に定義しなければならないケース)
どうやってやるかではなく求めるものが何であるかが重要となる。
とりあえずmaximumとかreplicateとかtakeとかは再帰で書けちゃう。
Maybe aを書くのがHaskellっぽいかもしれない
一般的な実装としては、エラーを返すより何らかの型を返してあげたほうが良さそう
挙動に注意すべし
otherwiseは使っていない
ちょっとむずかしいかも。[4,3,2] : [1]といった書き方は不可能であるし、自分自身に追記していくからオーダー的にはO(n2)で最悪。
もとのreverseはまだマシだけど、それでも大量のリストをさばこうとするとスタックオーバーフローになるかもしれない。
あと、Haskellの関数を調べたいならHoogleへ行きましょう。
https://www.haskell.org/hoogle/
そのまんまrepeat'をよびだすと無限ループで終わらないから注意
基底部は2つある
クイックソート
たぶん中ボス。
再帰的に考える
- 基底部を見極める
- 解くべき問題をより小さな部分問題へと分割する方法を考える