Yuji Yamamoto (山本悠滋)
2018-12-07
QuantifiedConstraints
これはよくない!
instance (Eq a, Eq (f (Rose f a))) => Eq (Rose f a)
where
(Branch x1 c1) == (Branch x2 c2)
= x1==x1 && c1==c2
QuantifiedConstraints
を有効にすると!
QuantifiedConstraints
を有効にすると!
contextに列挙するconstraintの中でconstraintが書けるようになる
例えば👇もOK。
従来のMonadTrans
だと、👇のMonadTrans
が定義できない!
lift
の第1引数が守るべきMonad m
を満たせない!
• Could not deduce (Monad (t2 m)) arising from a use of ‘lift’
from the context: (MonadTrans t1, MonadTrans t2)
bound by the instance declaration at <interactive>:53:10-66
or from: Monad m
bound by the type signature for:
lift :: forall (m :: * -> *) a. Monad m => m a -> Comp t1 t2 m a
これならできる!👍
そもそも、👇のように書くこともできる!
class (forall m. Monad m => Monad (t m)) => MonadTrans' t where
lift :: Monad m => m a -> (t m) a
みたいに書くと、型変数m
は
の中では有効でないように読めるけど、実際には有効らしい。
forall m.
を消すとエラーになってしまう力尽きたのでコピペは省略。時間が余ったらPDFを開きながら紹介しよう!