何故か書いてしまった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を使えばやはり元の値は取り出せる、危なげだけど