何故か書いてしまったduck typing (Haskell,存在型+型クラス)

存在型+型クラスでduck typing. 参照:http://www.haskell.org/haskellwiki/Existential_type
既に言及されてますが、このやり方だとHaskellはnonintrusive-explicit-dynamic に該当しますね。
テーブル修正しました。

class Duck a where
  quack :: a -> IO ()

data Dog = Dog
data Cat = Cat

-- non-instrusive --
-- 犬はアヒルだ
instance Duck Dog where
  quack _ = putStrLn "wuff!"

-- 猫もアヒルだ
instance Duck Cat where
  quack _ = putStrLn "meow."
  

data DuckObj = forall a. Duck a => DuckObj a -- 存在型aの動く範囲を型クラスDuckに制限

-- アヒルのリスト
dynamicDucks = [DuckObj Dog, DuckObj Cat] 

-- 鳴かせてみる
quackAll = mapM_ (\(DuckObj a) -> quack a) dynamicDucks
$ ghci -fglasgow-exts ducktyping.hs 
*Main> quackAll
wuff!
meow.

Remark : DuckObj に入れた値は二度と元の型の値として取り出せない。 例えば dynamicDucksから DogやCatを取り出すことはできない。これは裏技的だけれども、Typeableクラスとcast関数を使えばできる。
OCamlのstructural subtypingでも同じこと、ただObj.magicを使えばやはり元の値は取り出せる、危なげだけど