Tam olarak ne istediğinizi yapamayabilirsiniz, ancak başka bir olasılık, belirli bir olasılıkla, Show
ile yapmayı düşündüğünüz her şeyi açıkça yapan bir eylem sağlamaktır. ,
report :: Show a => M a -> M a
Ben Show
ile bu modelin iyi bir kullanım başımın üst kapalı düşünemiyorum:
data M a = {- ... -}
instance Monad M where -- notice: no Show constraint
{- ... -}
Sonra ilaveten bazı eylemi kaynağı olabilir: Yani, siz varsayarak, olduğu ama ben bir Ord
kısıtlaması için isteyebileceğiniz benzer bir örnek biliyorum. Kurulum, nondeterministic olan ([a]
gibi) bir monad yapmak istediğiniz, ancak kopyaların (Set a
gibi) bulunmadığıdır. Yinelenenleri kaldırmak için Eq
veya Ord
gibi bazı içerikler gerekir, ancak her return
/>>=
işleminde bunu talep edemeyiz. Bazı v1
çiftleşmesi ve v2
olsalar bile,
valuesOfInterest = collapse $ do
v1 <- allValues
v2 <- allValues
doSomethingInteresting v1 v2
Ardından:
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
Bu yüzden gibi kullanılabilir: Bunun yerine biz kullanıcı açıkça çiftleri birleşecek gerektiğini noktalarını işaretleyin talep Aynı ilgi değeriyle sonuçlanır, bu değer sonuçta sadece bir kez görünecektir.
Kullanım durumunuz için benzer bir hile de mümkündür.
'Tür eşleşme: 'Monad'ın ilk argümanı' * -> * 'olmalıdır, fakat' M a 'türünde' * '' –
@camccann Üzgünüz. Hayır, sorumu anlıyorum. Benimkilere benzeyen güncellenmiş cevabımı görün. – fuz
Downvoter kendisi açıklayabilir misiniz? – fuz