7 Stimmen

Ist es möglich, diese rekursive Haskell-Funktion in einen Map-Aufruf zu verwandeln?

Dies ist mein Code:

type HoraAtendimento = (String, Int, Int)

htmlHAtendimento :: [HoraAtendimento] -> Html
htmlHAtendimento [] = toHtml ""
htmlHAtendimento ((da,hia,hfa):[]) = toHtml da +++ "feira "
                                     +++
                                     show hia +++ "h - " +++ show hfa +++ "h"
htmlHAtendimento ((da,hia,hfa):r) = toHtml da +++ "feira "
                                    +++
                                    show hia +++ "h - " +++ show hfa +++ "h, "
                                    +++
                                    htmlHAtendimento r

Ich suche nach einer Möglichkeit, die Map-Funktion zu verwenden und diese rekursive Funktion loszuwerden. Ist das möglich und wenn ja, wie mache ich das?

12voto

Apocalisp Punkte 34088

Sehen Sie sich die Art der map . Es ist (a -> b) -> [a] -> [b] . Das sieht nicht wie Ihr Typ aus, der [a] -> b lautet. Das ist keine Karte, sondern eine Falte.

Die Funktion höherer Ordnung, die Sie sich ansehen möchten, ist foldr . Siehe Hoogle .

Etwas wie...

htmlHAtendimento :: [HoraAtendimento] -> Html
htmlHAtendimento [] = toHtml ""
htmlHAtendimento l = foldr1 (+++) $ intersperse ", " $ map f l
  where f (da, hia, hfa) = toHtml da
                           +++ "feira "
                           +++ show hia
                           +++ "h - "
                           +++ show hfa
                           +++ "h"

Ich weiß nicht, ob das richtig ist, aber es geht in die richtige Richtung.

0 Stimmen

Das ist eine Funktion, die ich sehr verwirrend finde und die ich nie lernen könnte... Könnten Sie mir ein Beispiel mit meinem Code geben? Ich habe einen Haufen ähnlicher Funktionen, und wenn ich nur ein Beispiel sehen könnte, würde ich die anderen wahrscheinlich auch schaffen...

0 Stimmen

Da die Liste nicht leer ist, sind Sie mit foldl1 oder foldr1 besser dran. Beispiel unten. ---NR

0 Stimmen

Sie werden lernen wollen, Faltungen zu verwenden, da sie eine äußerst nützliche Abstraktion darstellen. Üben Sie, einige einfache Rekursionen in Foldings umzuschreiben. Sehen Sie sich den Quellcode von foldr und foldl an.

2voto

Norman Ramsey Punkte 193087

Sie wollen eine nicht leere Liste umklappen. Mit diesem Code könnte das gelingen:

type HoraAtendimento = (String, Int, Int)

htmlHAtendimento :: [HoraAtendimento] -> Html
htmlHAtendimento [] = toHtml ""
htmlHAtendimento l = foldl1 (+++) $ map convert l
  where convert (da,hia,hfa) = toHtml da +++ "feira " +++
                               show hia +++ "h - " +++ show hfa +++ "h"

0 Stimmen

Damit lässt sich das ", " Chaos nicht beheben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X