2013-12-19 17 views
6
  • Sind Listen-Comprehensions einfach eine Sprachfunktion?
  • Was ist der einfachste Weg, ein Listenverständnis mit reinem Haskell zu fälschen?
  • Müssen Sie einen do-Block verwenden/>>=, um dies zu tun oder können Sie eine andere Methode verwenden, um ein Listenverständnis zusammen zu hacken?

Klarstellung: Mit „fake“ eine Liste Verständnis ich eine Funktion bedeuten erstellen, die denselben Eingang nimmt und den gleichen Eingang, dh eine Form für die Rückgabewerte, zusammen knirschen auflistet, und ein Prädikat oder mehrere Prädikate .Wie werden List-Comprehensions in Haskell implementiert?

+0

[Dies] (http: //www.haskell.or g/haskellwiki/List_comprehension) kann einige Ihrer Fragen beantworten. Es erklärt, wie verständlich syntaktischer Zucker für Do-Notation ist, die selbst nur syntaktischer Zucker für ">> =" sind, aber ich weiß wirklich nicht, was du unter "falsches Listenverstehen mit reinem Haskell" verstehst. Es ist reines Haskell, gemäß der Haskell-Spezifikation. – bheklilr

+1

Ich fügte eine Klarstellung hinzu, aber ich verstehe wirklich nicht, warum das so viele down votes erreicht, ich frage nur, wie ein Listenverständnis geschrieben werden könnte, ohne ein Listenverständnis zu verwenden, um sie besser zu verstehen. – reem

+6

Ich denke, es ist eine legitime Frage. Und ich habe es aufgewertet. – augustss

Antwort

19

Section 3.11 im Haskell-Bericht beschreibt genau, was Listenkomprehensionen bedeuten und wie man sie übersetzt.

Wenn Sie Monade Comprehensions Sie brauchen im Grunde [e] von return e, [] durch mzero zu ersetzen und concatMap durch (>>=) in der Übersetzung.

10

augustss ‚s Antwort auf vergrößern, wenn Sie so etwas wie haben:

[(x, y) | x <- [1..3], y <- [1..3], x + y == 4] 

... ist es auf diese Verwendung von do Notation äquivalent:

do x <- [1..3] 
    y <- [1..3] 
    guard (x + y == 4) 
    return (x, y) 

... das entspricht zu dieser Verwendung von concatMap:

concatMap (\x -> 
    concatMap (\y -> 
     if (x + y == 4) then [(x, y)] else [] 
     ) [1..3] 
    ) [1..3] 
Verwandte Themen