やっと話してくれた

Heskellの続き
関数合成がどうしても分からなかった。
fun1 a = a + 1
fun2 a b = a * b
(fun1 . fun2)1 2
とできないのがどうしてなのかさっぱりわからん。

が、やっと分かった。
関数合成演算子(.)は
(.) :: (b -> c) -> (a -> b) -> a -> c
なので、引数1コにしか対応できないみたい。
いっぱいあるときは合成できないのってちょっとがっかりかも。
(勘違いしてたらゴメンなさい)

今日はこの辺で

module Sample where 

    • 関数定義

foo x y = x + y
hoge = 2

    • 分岐
    • 引数パターンマッチング

boo 1 = "a"
boo 2 = "b"

func0 0 = 1
func0 n = n * func0(n-1)

    • ガード

func1 a b |a && b == 1 = "0!"
          |a          = "1!"
          |otherwise  = "2!"

    • if

func2 n = if n == 0
            then  "OK"
            else  "NG"

    • case

func3 n = case n of
  0->"a"
  1->"b"
  _->"c"

    • 補助関数
    • インデントに注意
    • where

func4 a b = c + d
  where
    c = a * b
    d = a * b

    • 同let

func5 a b = let
  c = a * b
  d = a * b
  in c + d

func6 a b = iter a 0
  where
    iter c d
      |c < b = (d,c)
      |otherwise = iter (c-b) (d+1)

func7 a b = a * b

f0 = \x->x + 1

func8 a = a + 1
func9 a b = a + b
func10 a = a - 1

hugs

ちょっとだけいじってみる。
簡単なプログラムを書く-> 実行して結果見る
っていう流れができないと、勉強にもならない。
func1 = 2
とかhugs上で書いても怒られちゃって関数定義すらできない。
なんでやねん、、、と思っていたらhugsでは対話的に関数定義ができないらしい。
そうなのかぁ・・・。

なので、.hsにいくつか関数を書いておいて
:l ファイル名
で読み込み

hugsから関数呼び出し

ファイルに書いた関数をちょこちょこ直す

:r で再読みこみ

hugsから関数呼び出し



とすることにした。
ようやく関数がかけたよ。モナドへの道は遠いなぁ。。。