Być może nie jesteś w stanie zrobić dokładnie tego, o co prosisz, ale inna możliwość polega na tym, że twoja monada przedstawia akcję, która wyraźnie robi wszystko, co myślisz o robiąc z Show
. Oznacza to, że przy założeniu, masz:
data M a = {- ... -}
instance Monad M where -- notice: no Show constraint
{- ... -}
Następnie można dodatkowo dostarczyć pewne działania:
report :: Show a => M a -> M a
nie mogę myśleć poza czubek głowy dobrego wykorzystania tego wzorca Show
, ale wiem o podobnym przykładzie, w którym można chcieć ograniczenia na Ord
. Konfiguracja polega na tym, że chciałbyś, aby monada była niedeterministyczna (jak na przykład [a]
), ale nie ma duplikatów (np. Set a
). Usunięcie duplikatów wymaga kontekstu, takiego jak Eq
lub Ord
, ale nie możemy wymagać tego przy każdej operacji return
/>>=
. Zamiast więc żądamy, że użytkownik wyraźnie zaznaczyć punkty, w których duplikaty należy coalesced:
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
ten może być stosowany tak:
valuesOfInterest = collapse $ do
v1 <- allValues
v2 <- allValues
doSomethingInteresting v1 v2
Wtedy, nawet jeśli niektóre parowanie v1
i v2
zdarzyć uzyskać taką samą wartość odsetek, ta wartość pojawi się tylko raz w wyniku.
Niektóre podobne sztuczki są prawdopodobnie możliwe również w przypadku użycia.
'Miły brak dopasowania: Pierwszy argument" Monada "powinien mieć rodzaj" * -> * ", ale" M a "ma rodzaj" * "' –
@camccann Przepraszamy. Nie Rozumiem pytanie. Zobacz moją zaktualizowaną odpowiedź, która jest podobna do twojej. – fuz
Czy osoba przeprowadzająca badanie mogłaby wyjaśnić swoje zdanie? – fuz