Concurrent Clean : 型クラスと存在型

ちょっと思うことがあっていろいろ試していたら、http://lethevert.blogspot.com/2006/10/what-does-this-program-means.htmlのようなバグ(?)を見つけたわけですが、
一番やりたいことはこういうことで、

::Number | Arith a :== a

あるいは、

::Number :== E.(Arith a): a

みたいな。
Arithクラスが

class Arith a where
  add :: a a -> a
  sub :: a a -> a
  mul :: a a -> a
  div :: a a -> a

だとすれば、

::Number = E.a: {num :: a
                ,add :: a -> a -> a
                ,sub :: a -> a -> a
                ,mul :: a -> a -> a
                ,div :: a -> a -> a
                }

というレコードを内部的に作ってくれるだけでよくて、関数呼び出しではそういうことをやっているのだからなーと。

      • -

あー、でもいろいろ難しいなー。
説明するのめんどいけど。