読者です 読者をやめる 読者になる 読者になる

きくらげ観察日記

好きなことを、適当に。

ImplicitParamをConstraintとして扱う

Haskell

=>の左側に来るものはすべてConstraintなので、暗黙引数をConstraintとして扱うこともできます。

{-# LANGUAGE ConstraintKinds, ImplicitParams #-}

type Showable t = ?show :: t -> String

print' :: Showable t => t -> IO ()
print' a = putStrLn $ ?show a

data MyData = MyStr String

showData :: MyData -> String
showData (MyStr s) = "MyData: " ++ s


hoge :: IO ()
hoge = do
  print' $ MyStr "hoge"
  print' $ MyStr "fuga"
  print' $ MyStr "foo"
  where ?show = showData

このような書き方を実際にすることは無いと思いますが、こうしてみると型クラスと暗黙引数渡しの関係がよく分かってきますね。