Dynamic

existential typeとTypeableを組み合わせれば

{-# OPTIONS -fglasgow-exts #-}
import Data.Typeable

data HsVal = forall a.(Typeable a)=>HsVal a

integerP :: HsVal -> Bool
integerP (HsVal z) = if (typeOf z)==(typeOf (1::Integer)) then True else False

とか出来ていいかな〜、と思ってたら、普通にData.Dynamicとかあった。GHCでは、普通にexistential typeを利用してるっぽい
(追記)いや、違うかも。"type Obj = forall a . a"のforallは普通に全称型なんだろうか。でも、全称型とすると、その意味は、全ての型の「共通部分」(つまり、ボトムのみからなる型)になるような。でも、"data Obj=foralla.Obj a"ならともかく。type宣言でも、forallが存在型に解釈されうるのだろうか
(追追記)"type Obj = forall a.(Show a)=>a"がいけるっぽいので、"type Obj=forall a.a"のforallの意味は存在型なのかな?何となく自信ない。というか、紛らわしすぎ

#ifndef __HUGS__
data Dynamic = Dynamic TypeRep Obj
#endif

#ifdef __GLASGOW_HASKELL__
type Obj = forall a . a
#elif !defined(__HUGS__)
data Obj = Obj
#endif


Dynamic使えば、普通にSchemeからHaskellへのtranslatorが書けそうな気が。パーサはParsecあるから即作れるし、S式をHaskellに翻訳するのも、template haskell利用すれば、楽っぽいし、労せずして、Schemeコンパイラが貴方の手にッ。

{-# OPTIONS -fglasgow-exts #-}
import Data.Dynamic

main = print $ (fromDynamic::Dynamic->Maybe Integer) 
               (dynApp (dynApp (toDyn ((+)::Integer->Integer->Integer)) 
                               (toDyn (3::Integer))) 
                       (toDyn (2::Integer))) 

・・・すごくめんどくさそうです。てか、これはもうHaskellなのか


あとまあ、Dynamicでも色々型付けして最適化は図れるよな〜とか。上の式は、print $Just (3+2)になってくれればいい。とかいう話は、Schemeとかで部分的に型推論して最適化するみたいな話があったような気がするので目新しくない


Cleanの場合。
http://sky.zero.ad.jp/~zaa54437/programming/clean/LanguageReport20/Chap8.html

例:異なった型のオブジェクトを1つのリストに包み込む3つの方法。

第1の方法は、一つのリストに包みたい全ての型を、それらを識別する適切な構成子でまとめる、新しい型を定義することである。解き開く場合、パターン照合のcaseで区別できる。全ては良く静的に型付けされているが、ラッパー型で参照される型を包むことができるに過ぎない。

次の方法は、存在型(5.1.3参照)を使用して一つのリスト構造を定義することである。どんな型でも包み込めるが、一度梱包されると、その要素を識別し、それを解き開くシンプルな方法は無い。

もう1つの方法は、その値をDynamicに包むことである。どんな型でも梱包でき、パターン照合を経由して、それらを解き開くことができる。しかし、これは非常に非効率で、パターン照合でその型を明示的に名づけることによって、値を解き開くことができるに過ぎない(8.2参照)。

2番目の方法はほぼ使い道がないような・・・。見た感じで、HaskellのDynamicとCleanのDynamicはほぼ同等の表現力を持ちそうだけど、Haskellが、ライブラリでDynamicを実現できるのは、存在型+Data.Typeableのおかげなのか((追記2)かどうかは怪しい。上の追記参照)。CleanがどうやってDynamicを実現してるのか分からないけど、多分言語レベルで対応してるんじゃないかなぁ。