すごいH本 読書会 #1
           @yashigani
[today tableOfContents]


   はじめに

   1章,2章のおさらい

    関数呼出/定義

    リスト

    タプル

    型

   練習問題的な
はじめに

関数型言語の経験は?

 (私の場合)ほんのちょっとの Scheme と少しの Scala




なんで Haskell やろうと思いましたか?




ちなみに今回の発表はドシロウトが発表しますので,わいわいツッコ
ミを入れながら楽しんでいただけると幸いです

わからないことは随時手を挙げて発言してください

 誰かが答えます
基本的なところ


だいたい想像通りです

   +,-,*,/,div,mod

True ¦ False

   not True # => False

   True == False # => False

   True /= False # => True

Selipnir + 3 # => ?
実は...

今までのは全部関数呼び出しです

 succ 5 # => 6

 max 9 10 # => 10

 max (9 + 2) 10 # => 11

 succ 9 * 10 # => 100

 5 * 2 # => 10

 9 `max` 10 # => 10

 (*) 5 2 # => 10
関数定義




関数名 引数 = 処理

  doubleUpMe x = x * 2

if 式

  odd n = if n `mod` 2 == 1 then True else False

  else は必須
リスト

連結

 [1, 2, 3] ++ [4, 5, 6] # => [1, 2, 3, 4, 5, 6]

 1:[2, 3, 4] # => [1, 2, 3, 4]

要素にアクセス

 Haskell !! 3 # => k

ネスト

 [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

比較
リストの操作




head

tail

last

init
大事なことなので

       tail

head


                      last



                    init
本当に大事なことなので...



  head   init




tail            last
リストの操作(2)

length

null

reverse

take

drop

maximum

minimum

elem
Range

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # => ugly!

[1..10] # => cool!

[ a .. z ] # => abcdefghijklmnopqrstuvwxyz

[2, 4..2 * 9] # => [2, 4, 6, 8, 10, 12, 14, 16, 18]

[1..] # => [1, 2, 3, 4, 5.....]

[2, 4..] # => 2の倍数の無限リスト

take 12 (cycle "hoge ") # => "hoge hoge ho"

take 3 (repeat 5) # => [5, 5, 5]

replicate 3 5 # => [5, 5, 5]
リスト内包表記



                 [x * 2 ¦ x <- [1..10]]
          [x * 2 ¦ x <- [1..10], x > 5]
                           ジェネレータ              フィルタ



[1 ¦ _ <- [1, 2, 3], _ <- [4, 5, 6]]

[[x * 2 ¦ x <- xs] ¦ xs <- [[1,2,3], [4,5,6], [7,8,9]]]
タプル


複数の違う型の要素をまとめて1つの値として使う

         ( Mountain Lion , 10.8)

         違う型を入れられる

         固定長

zip

      zip [1, 2, 3] [4, 5, 6] # => [(1, 4), (2, 5), (3, 6)]

      zip [1,2,3,4] (repeat "hoge") # => [(1,"hoge"),(2,"hoge"),
      (3,"hoge"),(4,"hoge")]
型

型宣言

 zip :: [a] -> [b] -> [(a, b)]

 型にあってないものはコンパイルできない

 -> Haskell ではコンパイル時にすべての型が自明


型推論

 コンパイラが予想して補完してくれてた

 read 5 みたいなのは実行時まで推論できない

    read 5 :: Int のように明示してやる
型変数



オブジェクト指向のクラス...ではない

ジェネリクスみたいなもの



    (==) :: Eq a => a -> a -> Bool
           型変数



型クラスは抽象的なインターフェース

型は複数の型クラスのインスタンスである
代表的な型クラス

Eq

Ord

Show

Read

Enum

Bounded

Num

Floating

Integral
ここまでで質問ある方
言いたいことのある方
   どうぞ!
[today exercise1]


   以下の関数を自分で定義してみる

    null

    sum

    product

    elem

   python のスライスを実装する

    ex) slice 2 5 [1..7] # => [3, 4, 5]
[today exercise2]




   フィボナッチ数列のn番目の数列を返す関数を作る




   FizzBuzzの n 項目から m 項目までのリストを返す関数を作る

    ex) fizzBuzz 50 100 # => 50番目から100番目までを返す

    fizzBuzz :: Int -> Int -> [[Char]]
[today exercise3]


   3けたの整数のうち、次の条件を満たすものを「良い整数」とよぶこ
   とにします。

   条件:3けたの整数を2つの整数に分けてその和を考えると、常にも
   との整数の約数になっている。

   (例)330は3と30に分けても、33と0に分けても和が330の約数に
   なっています。このため、330は「良い整数」となります。ですが、
   702は7と02に分けた場合は約数になりますが、70と2に分けてしま
   うと約数になりません。よって、702は「良い整数」ではありませ
   ん。

   一の位が0でない「良い整数」を4個求めなさい。

すごいHaskell読書会#1 in 大阪