ushidayの日記

主に「IBMi」のメモに・・・

第二回Haskell読書会

第二回Haskell読書会が無事終了いたしました。今回、体調が悪く絶不調であまり発言する元気がなかったので、少しおとなしめで終わってしまいました。第三回頑張ります。(最近モヤットなのでパーッと飲みに行きたい!!)

内容ですが、スピーカのたかはしさんが、”操作させる”、”考えさせる”的な手法で、非常にうまい説明をして頂けたと思います。違った見方ですが、こういう面も非常に参考になり、勉強会として価値があると思いました。
今回の章は、主に”型”、”カリー化”、”クラス”についてがメインテーマでした。
型は、コンピュータ言語をやっている”方”にとっては、入り口的なところなので、みなさん理解も良かったのではと思います。ただ関数型言語における型とは、手続き型のソレとは違い、引数から返り値までを型という表現で表します。これは、GHCiやHugsの「:type」コマンドで確認することが出来ます。

Prelude> :type tail
tail::[a]->[a]

若干GHCiとHugsで表現の違いもあるようです。([Char]がStringだったり)

カリー化について、言葉で表すのって難しいですね。細かいことはハッキリ言ってわかりませんが(単に1つの引数をとって残りの部分を関数として返すとザックリ目に理解したとして)、Haskellの場合は、意識せずカリー化された関数になっている処が、凄いとは思います。

myadd::Int->Int->Int
-- myadd::Int->(Int->Int)
myadd x y =  x + y

この場合は、letを使う事で、関数が部分適用されている様が、わかる事を教えて頂きました。(letはHugsでは駄目らしい)下の例では、"myadd"にx=1を部分適用した、常に1を加える関数を"myadd'"に戻り値として受けている事がわかります。

*Main> let myadd' = myadd 1
*Main> myadd' 5
6

■カリー化・自分的理解
myadd 1 5

myaddの引数xに1を適用した無名関数を返す
無名関数(myadd 1) y = 1 + y

無名関数::Int->Int
無名関数 y = 1 + y

無名関数 5

無名関数 5 = 1 + 5

結局引数が幾つあっても、1つ引数をとって、残りの関数を返すという事を意識せず出来る所に素晴らしさが、あるのでしょう。まだ自分はありがたみが分かる程理解出来てないのが悲しいですが...orz。

クラスについても、オブジェクト指向のクラス、インスタンス、メソッドとは、違うというか、当てはめようとしても違和感があります。

■クラス・自分的理解
クラス・・・関数の集合
メソッド・・・クラスと言う定義によって集められた関数たち
インスタンス・・・メソッドの引数として取れる型

今のところ、自作の関数を作ろうとした時に、引数の制約として使う事が主のようなので、ザックリ理解で先に進めないと行き詰まってしまいそうです。
例えば
Eqクラスを調べるには

*Main> :i Eq
class Eq a where
  (==) :: a -> a -> Bool
  (/=) :: a -> a -> Bool
        -- Defined in GHC.Classes
------ 中略 ------
instance Eq Integer -- Defined in GHC.Num
instance Eq Float -- Defined in GHC.Float
instance Eq Double -- Defined in GHC.Float
instance Eq Bool -- Defined in GHC.Base
instance Eq Ordering -- Defined in GHC.Base
instance Eq Char -- Defined in GHC.Base
instance Eq Int -- Defined in GHC.Base
------ 中略 ------

Eqクラスのメソッドは「(==)左辺と右辺が同じ時真」と「(/=)左辺と右辺が異なる時真」(比較演算子的な関数)です。
関数の引数にEqクラス制約があった場合は、実装でその引数に対してメソッド(==や/=関数)が使われているから、引数に対してシバリを入れている。
==や/=関数に引数にとる事が出来るのが、インスタンスになる?==や/=も引数に同じ制約が入っている?少し煮え切らない部分もありますが、その内視界も開けてくるでしょう。
任意の関数型がEqクラスのインスタンスにならないのは、感覚的に分かる気がします。引数にとる型のパターンがあまりに多すぎて、通常は比較しようがないのでは?的な理解です。

まだ3章なので、ぼんやりですが、回が進に連れて、ハッキリしていければ良いなと思います。

第三回も日程は決まりましたが、会場まだなのでまた後日告知します。

ちなみにおやつは、美味しい”シュークリーム”でした。次回はプリン楽しみ。:-)