Commits

blooper committed 40b130d

correct the erroneous description about type class

  • Participants
  • Parent commits c141459

Comments (0)

Files changed (2)

 # built documents.
 #
 # The short X.Y version.
-version = '0.1'
+version = '0.1.1'
 # The full version, including alpha/beta/rc tags.
-release = '0.1'
+release = '0.1.1'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.

join_to_Monad.rst

 
 なるほど、Num というのは type class だそうです。type class?
 
-========================
-type class って何なのよ?
-========================
+=====================================
+type class って何なのよ? [#eagletmt]_
+=====================================
+
 
 type class ってのは何だろうと思うわけですが、:info の結果の下に書いてあることで類推してみます。(+), (-), (*) という 3 つの二項演算子と negate, abs, signum, fromInteger, fromInt という 5 つの関数が定義されている「何か」なのですね。
 
-何でこんなもん用意しているかというと、Haskell は「強い型付け」がされているから、だと思っています。例えば `OCaml <http://ocaml.jp/>`_ という、やはり強く型付けられているコンピュータ言語があります。OCaml ももちろん int や float という数値が入る型を持つのですが::
+何でこんなもん用意しているかというと、同じ性質を持つ人達にまとめてレッテル貼ってひとからげに扱ってあげましょう、ということみたいです。例えば `OCaml <http://ocaml.jp/>`_ という、やはり強く型付けられているコンピュータ言語があります。OCaml ももちろん int や float という数値が入る型を持つのですが::
 
   $ ocaml
           Objective Caml version 3.11.2
   
-  # 1 + 1 ;;
+  # 1;;
+  - : int = 1
+  # 1.0;;
+  - : float = 1.
+  # 1 + 1;;
   - : int = 2
-  # 1 + 1.0 ;;
+  # 1 + 1.0;;
   Error: This expression has type float but an expression was expected of type
            int
-  # 1.0 + 1.0 ;;
+  # 1.0 + 1.0;;
   Error: This expression has type float but an expression was expected of type
            int
 
-int と int を足すには (+) を使いますが、int と folat は足せません。いわんや int と float をや。じゃぁ float と float なら足せるの? というとやっぱりそれもダメなのです。(+) は int と int を足す為のものなのです。じゃぁどうするのか?::
+1 は int として、1.0 は float として解釈されてます。int を足すには (+) を使いますが、int と folat は足せません。いわんや int と float をや。じゃぁ float と float なら足せるの? というとやっぱりそれもダメなのです。(+) は int と int を足す為のものなのです。じゃぁどうするのか?::
 
-  # 1.0 +. 1.0 ;;
+  # 1.0 +. 1.0;;
   - : float = 2.
 
 その為には (+.) という別の演算子が用意されているのです。ΩΩ Ω。びっくりしましたか? 私は最初に聞いたときはびっくりしましたがもぉ慣れました。慣れというのは時には偉大なものです。そして OCaml は素敵なものです。
 
 OCaml は強い型付けをしていて更に下手な型変換はしないと心に誓ったようで、int と float の為に (+) と (+.) という別々の演算子を用意しました (float 用はまだまだあります、(-.) とか (\*.) とか (/.) とか)。その頃 Haskell はどうしたかというと::
 
+  Hugs> :type 1
+  1 :: Num a => a
+  Hugs> :type 1.0
+  1.0 :: Fractional a => a
   Hugs> :type 1 + 1
   1 + 1 :: Num a => a
   Hugs> :type 1.0 + 1
   instance Integral a => Fractional (Ratio a)
 
 
-ほうほう。Fractional という type class があるんだけどそれは Num が元になっていて、更に (/) と recip と fromRational と fromDouble が加わってるものだと。Float や Dobule は Fractional の instance であると。元に Num があるから (+) とか (-) が使えてしまうですね。
+ほうほう。Fractional という type class があるんだけどそれは Num が元になっていて、更に (/) と recip と fromRational と fromDouble が加わってるものだと。Float や Dobule は Fractional の instance であると。えー、じゃぁ型はどこに行っちゃったの? というと::
 
-Haskell は変換する道を選びました。が、更に type class というものを導入して似たような? 演算子や関数をまとめて使い回せるようにした、みたい。そもそも型をどういうときにどう変換するかなんて知らないし僕。ともかく、
+  Hugs> 1 :: Int
+  1
+  Hugs> 1 :: Float
+  1.0
+  Hugs> 1.0 :: Int
+  ERROR - Cannot infer instance
+  *** Instance   : Fractional Int
+  *** Expression : 1.0
+
+  Hugs> 1.0 :: Float
+  1.0
+  Hugs> (1 :: Int) + (1 :: Int)
+  2
+  Hugs> (1 :: Int) + (1 :: Float)
+  ERROR - Type error in application
+  *** Expression     : 1 + 1
+  *** Term           : 1
+  *** Type           : Int
+  *** Does not match : Float
+
+  Hugs> (1 :: Float) + (1 :: Float)
+  2.0
+  Hugs> :type (+)
+  (+) :: Num a => a -> a -> a
+
+ほほぉ、1 は Num として解釈されていましたが、Num の instance である Int や Float として型が確定できると。1.0 は Fractional として解釈されるから Int には戻れないけど Float にならなれると。でも Fractional は元に Num があるから (+) とか (-) が使えてしまうですね。そして 1 + 1.0 なら Fractional に合わせてくれる。そして型の確定まで遅延されている! 何かまどろっこしいけどカッコイイよ type class!!
+
+Haskell は type class というのを用意することによって、強い型付けを持ちつつも同じ演算子・関数を複数の似たような型に対して使えるようにしてくれました。
 
 * 有理数は体だけどその前に環であり群だし、加法の記号は一々切り替えたくないよね!
 * Interface を用意しといて implement! polymorphism!!
 * http://en.wikibooks.org/wiki/Haskell/Category_theory
 
 `The Monad.Reader <http://themonadreader.wordpress.com/>`_ の `Issue 13 <http://haskell.org/sitewiki/images/8/85/TMR-Issue13.pdf>`_ の The Typeclassopedia を日本語に訳して下さってる方がいらっしゃいまして、ありがたいことです。join に関しては Wiki にも書いてあるよ、と書いてあったので貼っておきます。(>=>) のことも書いてあります。
+
+
+.. rubric:: 脚注
+
+.. [#eagletmt] リテラルの解釈と型の変換と勘違いしてました。教えてくれた `@eagletmt <http://twitter.com/eagletmt/status/15267869845>`_ さん、ありがとう!