あなたが求めていることを正確に行うことはできないかもしれませんが、特定のモナドがShow
を使ってやっていることを明示的に行うアクションを提供する可能性もあります。それはあなたが持っていると仮定、次のとおりです。
data M a = {- ... -}
instance Monad M where -- notice: no Show constraint
{- ... -}
次に、あなたは、さらにいくつかのアクションを供給できます。
report :: Show a => M a -> M a
私はShow
と、このパターンの良い使用の私の頭の上から考えることはできません、しかし私は、あなたがOrd
の制約を望むかもしれない同様の例を知っています。設定は、非確定的(例えば、[a]
)のモナドを作成したいが、重複はありません(Set a
など)。重複を削除するには、Eq
またはOrd
のようなコンテキストが必要ですが、return
/>>=
の操作ごとに要求することはできません。
newtype Setlike a = Setlike { toList :: [a] }
instance Monad Setlike where
return x = Setlike [x]
Setlike xs >>= f = [y | x <- xs, let Setlike ys = f x, y <- ys]
collapse :: Ord a => Setlike a -> Setlike a
collapse = Setlike . Data.Set.toList . Data.Set.fromList . toList
これがそうのように使用することができます:いくつかのv1
のペアリングとv2
はに起こる場合でも、その後
valuesOfInterest = collapse $ do
v1 <- allValues
v2 <- allValues
doSomethingInteresting v1 v2
だからではなく、私たちは、ユーザーが明示的に重複が合体しなければならないポイントをマークすることを要求します同じ関心の値になり、その値は結果に1回しか表示されません。
あなたのユースケースでも同様のトリックが可能です。
'カインドミスマッチ: 'Monad'の最初の引数はkind '* - > *'である必要がありますが、 'M a'はkind '*' ' –
@camccannです。いいえ、私はその質問を理解していない。あなたのものに似た私の更新された答えを見てください。 – fuz
ダウンボッターは自分自身を説明できますか? – fuz