スーパータイピング

hypersetって何?なレベルなのだけど。;-)Set uかuかによってアルゴリズムが違うのでタイプクラスを使わないとできなさそう。
マルチパラメータタイプクラスを使わずにできるだろうか?

問題

f :: k -> A a -> B
k として型 a または C a をとれるような関数fを定義せよ。

  • 解答(もどき)1

まずElmとタグをつけてともに生きる。Eitherよりは使いやすいが…

newtype Set a = Set [Elm a]
newtype Elm a = Elm a
data SupT a = Elm_ (Elm a) | Set_ (Set a) 
  -- Elm, Setのタグを外したほうがいいだろうか?

class SubT c where
  inject :: c a -> SupT a

instance SubT Elm where
  inject = Elm_ 
instance SubT Set where
  inject = Set_ 

member :: SubT c => c a -> Set a -> Bool
member = undefined