読者です 読者をやめる 読者になる 読者になる

by shigemk2

当面は技術的なことしか書かない

第2期 第4回 H本読書会 in 秋葉原 #readhbon

Haskell 勉強会

第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つある

クイックソート

たぶん中ボス。

再帰的に考える

  1. 基底部を見極める
  2. 解くべき問題をより小さな部分問題へと分割する方法を考える