class Foo a where foo :: a -> String class Bar a where bar :: a -> Int instance Foo Integer where foo = show instance Bar Int where bar = id -- 型クラス制約の「和」を取る関数を定義したい someFunc :: (Foo a OR Bar a) => a -> IO () someFunc x = let y = foo x OR ("Bar:" ++ show (bar x)) in putStrLn y main :: IO () main = do someFunc (123 :: Integer) -- Integer は Foo を満たす someFunc (456 :: Int) -- Int は Bar を満たす という風に書きたい状

