Co usiłuję zrobić jest trywialny do określenia przez strony, w zasadzieJak w prosty sposób używać wartości may monoid i łączyć wartości z niestandardową operacją?
maybeCombine :: (a->a->a) -> Maybe a -> Maybe a -> Maybe a
maybeCombine _ Nothing Nothing = Nothing
maybeCombine _ (Just a) Nothing = Just a
maybeCombine _ Nothing (Just a) = Just a
maybeCombine f (Just a) (Just a') = Just $ f a a'
to nie jest wielka sprawa define this locally when needed, ale nadal cumbersone i jest tak proste i ogólnie wydaje się, że powinno być standardem realizacji, ale nie mogę tego znaleźć.
Może po prostu coś przeoczyłem. To, czego chcę, wydaje się zupełnie niezwiązane z zachowaniem monady, więc myślę, że nie znajdę niczego w szufladach Monada/Strzała; ale na pewno przypomina Monoid
instancji
Prelude Data.Monoid> tylko "" <> Nic
tylko "a"
Prelude Data.Monoid> Tak "a" <> Po prostu "b"
po prostu "ab"
...
... co jednak wymaga a
być sama monoid, to znaczy, że to w zasadzie ma a->a->a
"wbudowany". Instancja MonadPlus
zachowuje również podobnie jak chcę, ale to po prostu wyrzuca jedną z wartości, a nie pozwalając mi dostarczyć funkcję połączeniu
Prelude Data.Monoid Control.Monad> Just 4 `mplus` Nic
tylko 4
Prelude Data.Monoid Control.Monad> Nic `mplus` tylko 4
tylko 4
Prelude Data.Monoid Control.Monad> tylko 4` mplus` tylko 5
tylko 4
Jakie byłoby rozwiązanie kanoniczne? Lokalne dopasowywanie wzorców? Coś z kombinatorami z np. Data.Maybe
? Definiowanie niestandardowego monoidu do łączenia?
nie jestem pecha, w Problem Pracuję nad tym, mogę teraz użyć półgrupy "Max" i uzyskać naprawdę fajne rozwiązanie! – leftaroundabout
Awesome! Często kończę definiowanie "Option (Max a)" jako łączącego "negatywną nieskończoność" z typem, więc absolutnie. Myślę, że to naprawdę elegancki "Monoid". –