型クラスのパラメタ多相?
Either a b
(但しaとbは何らかの共通の制約を持つ)に適用できる f g = either g g
という関数を書こうとしたが,書けなかった.特定の型クラスに限定すれば書くことができる.
{-# LANGUAGE RankNTypes #-} fshow :: (Show a, Show b) => (forall c. (Show c) => c -> d) -> Either a b -> d fshow g = either g g feq :: (Eq a, Eq b) => (forall c. (Eq c) => c -> d) -> Either a b -> d feq g = either g g -- f :: (k a, k b) => (forall c. (k c) => c -> d) -> Either a b -> d -- f g = either g g -- => malformed class assertion g h = print $ map h [Left 42, Right 'a'] main = g (fshow show) >> g (feq (\x -> x == x))
Show
や Eq
のところをパラメタにすればよさそうに思ったのだけど,GHCではコンパイルエラーになってしまった.一体どうすれば…