7

这是我的代码:

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

我正在寻找一种使用 map 函数并摆脱这个递归函数的方法。这可能吗?如果可以,我该怎么做?

4

2 回答 2

12

看类型map。它是(a -> b) -> [a] -> [b]。这看起来不像你的类型,即 [a] -> b。那不是地图,那是折叠。

您要查看的高阶函数是foldr。参见Hoogle

就像是...

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"

我不知道这是否正确,但这是正确的方向。

于 2008-12-18T03:48:09.633 回答
2

你想折叠一个非空列表。这段代码可能会奏效:

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"
于 2008-12-18T03:55:07.933 回答