Meine Frage bezieht sich auf eine andere Frage auf die Antwort: https://stackoverflow.com/a/11766789/3212958Wird <- implizit Typen in einem Haskell-Block blockiert?
In seiner Antwort ertes schreibt die folgende Art Signatur
select :: [a] -> [(a, [a])]
Wenn jedoch select
tatsächlich verwendet wird, ertes schreibt das folgende innerhalb eines do
Block
(y, ys) <- select xs
Bitte helfen Sie mir etwas Licht auf, wie das Tupel (y, ys)
entspricht den Rückgabetyp wählen, Namen ly [(a, [a])]
. Verändert Haskell die Typen irgendwann? (Hat Haskell jemals Arten zu erzwingen?) Ist <-
ein Tupel des Typs aus der Liste Monade extrahieren, die select
zurückgibt?
Danke, Max
--- EDIT: ---
@Lee newbs bevor Sie versuchen, über Typen desugar erinnert an die Vernunft. Nachdem Sie >>=
explizit gemacht haben, ist es klarer, was vor sich geht. Nach Entzuckern, sucht die Funktion in Frage wie:
select xs >>= \(y, ys) -> fmap (y:) (perms (n - 1) ys)
Und für Listen, xs >>= f = concat (map f xs)
. So ein besserer Messwert von (y, ys)
in diesem Zusammenhang ist als die Signatur der Funktion, um über die Liste abzubilden.
'select' gibt eine Liste zurück. Wenn Sie 'a> = func'. Bind für Listen ist wie folgt definiert: 'm >> = f = concat (map f m)', also schreiben Sie 'map func (select xs)'. Es gibt keine Art Zwang in Haskell. –
user2407038
@ user2407038 einige geringfügige Technik hier; 'a' ist nicht 'jedes Element',' a' repräsentiert * ein * (beliebiges aber spezifisches) Element der Liste. –