nobsun です。

> > 各オペレータの型は
> > 
> > (^)  :: (Num a, Integral b) => a -> b -> a
> > (^^) :: (Fractional a, Integral b) => a -> b -> a
> > (**) :: (Fractional a) => a -> a -> a
> > 
> > で、文脈 context が違います。ポリモルフィックにする場合文脈が同じでないと
> > 定義しようがありません。
> 
> というか、何故contextを違えて定義する必要があるのか
> (実装上の要請ではなく、本質的にこれらの間に違いがあるのか)
> という点に引っかかったものですから。

数学的にいってもコンテキスト毎に別定義のものだから?

まず、power :: a -> b -> a というので統一的に定義しようとすると、
a と b については、コンテキストが必要ですよね。で、それを

power :: [Ctx (Num a, Integral b)
         ,Ctx (Fractional a, Integral b)
         ,Ctx (Fractional a, Fractional b, sametype (a,b))]
      => a -> b -> a
power x y = case context of
              Ctx (Num a, Integral b) -> ...
              Ctx (Fractional a, Integral b) -> ...
	      Ctx (Fractional a, Fractional b, sametype (a,b)) -> ...

などと定義することになります。(もちろん Haskell でこんな構文はありませんけど)

このようなものに同じ名前 power を与えることが、抽象化に役立つか?
ということだと思います。コンテキストを同じにするということは、要するに、
power が定義するクラス、たとえば、

class Expo c a b where
  power :: a -> b -> c a b

のようなクラスを考えるのと同じで、あまり使いものにというか、ありがた味が
ないから。というのが理由でしょう。たぶん ^^;。って、やはり実装上の都合
ということになるのかな。

> ただ、Prelude.hsやComplex.hsあたりを眺めてみると、なるほど
> Num、Integral、Fractionalを厳密に使い分けてるようなんで、
> 使う方の意識としてこの3つは別物だとしてもおかしくはないかな、
> と思い始めました。

Num、Integral、Fractional というクラスは区別することで、あるいは、そのように
同一視することで、いろいろな問題の抽象化に役立ちそうだけど、Expo のような
抽象化はあまりうれしくないと思いますがどうでしょう。

「よく似た」計算という謂は曲者で、たとえば、(+) と (++) はよく似た計算
といえば言えなくないですし、ruby ではたしか、+ でどちらも書けたと思います。
でも、これを同一視することは、いわば、Num と String を同一視する抽象化です。
これが、嬉しい場合というのが、私は、あまり思いつかないのです。
おなじことを Haskell の設計者は (^)、(^^)、(**) について、感じたのでは。。。

--
Nobuo Yamashita                 mailto:nobsun / sampou.org
  I love programming.           http://www.sampou.org/
  I love pencil puzzles.        http://www.puzzle.jp/


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/