2016-05-23 26 views
3

Ich möchte Minimum mit foldr oder foldMap implementieren. Nach der Übung, sollte es diese Definition haben:Wie implementiere ich Minimum mit foldr (oder foldMap)?

mini :: (Foldable t, Ord a) => t a -> Maybe a -- named "mini" to avoid name clash 

Es ist ziemlich einfach klang, aber ich weiß nicht, was ich für X unter substiture kann, damit es funktioniert. Hilfe bitte?

mini xs = Just (foldr min X xs) 

Und Sie erhalten Bonuspunkte, um mir zu zeigen, wie man es mit foldMap auch macht, aber das scheint härter.

+0

Auch schlägt die Funktion fehl oben, wenn xs die leere Liste ist, aber selbst sollte ich in der Lage sein, die schließlich zu beheben. –

+1

Siehe diese Frage für verschiedene Möglichkeiten, dies zu erreichen (offensichtlich nur max mit min ersetzen): http://stackoverflow.com/questions/12216886/monoid-mempty-in-pattern-matching –

Antwort

4

Sie könnten tun:

mini :: (Foldable f, Ord a) => f a -> Maybe a 
mini = foldr maybeMin Nothing 
    where 
    maybeMin x Nothing = Just x 
    maybeMin x (Just y) = Just (min x y) 
+0

Danke, das war mein erster Versuch, aber ich fügte ein 'vielleichtMin Nothing Nothing' hinzu, das es nicht kompilieren ließ. D'oh. –

+1

@TheUnfunCat Eine Sache, die Sie hilfreich finden könnten, sind getippte Löcher. Wenn du schreibst mini :: (faltbares t, Ord a) => t a -> Vielleicht a; mini xs = foldr _ Nichts xs', GHC wird dir den Typ des Wertes mitteilen, der dorthin gehen soll, wo '_' steht. –

-1

Sie könnten versuchen, indem Sie "X" durch das erste Element in der Liste ersetzen. Natürlich sollten Sie jetzt mit dem Fall umgehen, wenn die Funktion 'mini' mit einer leeren Liste aufgerufen wird.