Можно ли превратить эту рекурсивную функцию haskell в вызов карты? - PullRequest
7 голосов
/ 18 декабря 2008

Это мой код:

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

Я ищу способ использовать функцию карты и избавиться от этой рекурсивной функции. Возможно ли это, и если да, то как мне это сделать?

Ответы [ 2 ]

12 голосов
/ 18 декабря 2008

Посмотрите на тип 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"

Я не знаю, правильно ли это, но это в правильном направлении.

2 голосов
/ 18 декабря 2008

Вы хотите сложить непустой список. Этот код может помочь:

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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...