自由群の計算(2)

あれやこれやで理由を付けて(要するにサボっていた)群の話を全然進めていなかったが,以前より少しだけHaskellの勉強が進んだので自由群の定義を書きなおしてみた. 今回は Group 型クラスと,その instane としての FreeGroup という事にして書いてみた. ※コードがコンパイルを通ったところで満足したのでテストはこれから.

(Haskell なのにコメントが//で始まっていたりするのはご愛嬌. Wordpress のコード表示が Haskell に対応しておらず,やむなく親戚(?)の Scala だということにしてコード表示方式を設定している.)

//------------------------------------
//-- General Group type class
//------------------------------------
class (Eq a) => Group a where
  unit :: a
  (#) :: a -> a -> a
  inv :: a -> a
  pow :: a -> Int -> a
  x `pow` n  | (n==0)    = unit
             | (n >0)    = foldl1 (#) (replicate n x)
             | otherwise = foldl1 (#) (replicate (-n) x)

//------------------------------------
//-- Element for Free Group
//------------------------------------
type Element s = (s, Int)
antielement :: Element s -> Element s
antielement (x, i) = (x, -i)

//------------------------------------
//-- FreeGroup
//------------------------------------
data FreeGroup s = Word [Element s]

reduce :: (Eq s) => [Element s] -> [Element s]
reduce = foldr  reduce_rec []
  where reduce_rec :: (Eq s) => Element s -> [Element s] -> [Element s]
        reduce_rec t [] = [t]
        reduce_rec t (u:us) = (red2 t u) ++ us
          where red2 :: (Eq s) => Element s -> Element s -> [Element s]
                red2 (s1, i1) (s2, i2)
                  | (s1==s2)&&(i1+i2==0)  = []
                  | (s1==s2)              = [(s1, i1+i2)]
                  | otherwise             = [(s1,i1), (s2, i2)]

instance (Eq s) => Eq (FreeGroup s) where
  (==) (Word xs) (Word ys) = (reduce xs) == (reduce ys)

instance (Eq s) => Group (FreeGroup s) where
  (#) (Word xs) (Word ys) = Word (reduce (xs++ys))
  inv (Word xs) = Word (map antielement (reverse xs))
  unit = (Word [])

C82に参加してきました/関数型イカ娘本#4を書かなイカ!!

 2012/08/12のことですから少し前の話なのですが C82(コミックマーケット82)に,サークル「参照透明な海を守る会」のメンバーとして参加してきました (https://ikmsm.pastillage-research.org/ikmsm/books/c82.html). 今回は表紙だけでなく,記事を一本書きました. (上記リンクページにて本のサンプル PDF を見ることができます.)

想定した読者
 理工系の学部教養で習ったであろう集合と写像の簡単な知識を持つ人です. 関数型言語,特に Haskell への関心がある方を読者として想定しましたが,それ以上の知識を想定はしないようにしました. (何より,私自信が言語の深い理論を知らず, Haskell についても初心者なので書こうとしてもそんなに難しい話は書けません).

記事「蓮物語」の概要と目的
 記事冒頭からそのまま引用します.

 集合と写像について一応のことを知ってはいるけれど関数型言語に触れたことがない主人公が Haskell を学びます。同時に主人公は圏論の初歩を学び、圏論を応用すると Haskell の幾つかの重要な型クラスの挙動が理解しやすくなることを知ります。物語を通し、主人公は最小限の圏論の知識を手がかりに Haskell の型を理解しようと試行錯誤することになります。

 このような話題をきちんと論じるならば、集合と写像のなす圏を圏論の立場で丁寧に抽象化してから論じることになるでしょう。とはいうものの、圏論をゼロから学び cartesian closed category のあたりまで進めるのはなかなか大変です。そこまで徹底した抽象化を前提としなくてもHaskellと圏論の関わりを説明することはある程度可能だと筆者は考えました。物語を通して、圏論についての初歩的な知識を紹介し、 Haskell の幾つかの重要な型クラスが従うルールを圏論の立場から説明します。

感想
 久々に院生時代の論文執筆なみに呻吟することになったのですが,こういう機会でも無ければ深く掘り下げて勉強することもできないので,参加して良かったと思います. サークルメンバーの多くとは Twitter でも会話できるのですが, Skype のグループでのチャットは文字制限も緩いし場外からのトビゲリ・アンブッシュの心配もなく和気あいあいと話をすることができたので非常に楽しかったです. 

関数型イカ娘本#4を書かなイカ!!
 さてどちらかというとこちらが本題なのですが,C83(当落はまだわかりません)を前提として関数型イカ娘の四冊目の本を企画中です.  最終原稿作成や印刷依頼などの都合上2012/11/18(日)深夜が締め切りです. 

 サークルメンバーの皆さんは(私をのぞいて)皆スゴイ級の人たちですが,元々こういうノリで始まったサークルということもあり,内容の高度さよりは妄想の濃さを歓迎するようなサークルなので,是非お気軽に参加ください. 「すごい Haskell たのしく学ぼう ! 」の訳者のお二人(@tanakh さん,@nushio さん)とも Skype でチャットできますよ!