用HTML内容替换字体标记



我现在正在做这个家庭作业,但我不知道。有人能帮我吗?

给定以下用于表示HTML的数据类型:

type HTML = [HTML_element]
data HTML_element = HTML_text String
                  | HTML_font Font_tag HTML
                  | HTML_p HTML
                  | HTML_ul [HTML]
                  | HTML_ol [HTML]
data Font_tag = Font_size Int
              | Font_face String
              | Font_color Font_color
data Font_color = Colour_name String
                | Hex Int
                | RGB Int Int Int

编写Haskell函数:

strip_font_tags :: HTML -> HTML

它将删除所有字体标签,并将其替换为HTML内容。

我想这里的其他人都没有抓住这个练习的要点。以下是我解释问题后的思考过程;也许这能给你一些指导。

我想考虑一次对一个HTML_element进行操作,所以我想要一个在某个时刻具有类型HTML_element -> ???的函数;弄清楚CCD_ 3可能是什么将是一个巨大的第一步。第一步是为???选择HTML_element,但这并不完全有效,因为字体标记的内容是HTML,而不是HTML_element。嗯…HTML又是什么?啊,是的,type HTML = [HTML_element]!所以,实际上,在每种情况下,我都可以返回一个HTML;在非字体的情况下,我可以将单个元素封装在singleton列表中。

嗯,但是现在呢?我想知道,既然我已经编写了每个元素的函数,是否有一个函数能满足我的需求。。。

好吧,简单的方法是用另一个HTML_element替换HTML_element——这是一个保留结构的转换,您可能会稍微更改数据,编写一个Functor实例,然后只使用fmap——您的映射是"如果是HTML_font _ x,则返回例如HTML_p x;如果不是,则原样返回"。

这是用SYB:表达的

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Generics
data Element
    = Text String
    | Font [Element]
    | Para [Element]
    deriving (Show, Typeable, Data)
-- replace Font with Para
replace' :: Element -> Element
replace' (Font x) = Para x
replace' x = x
-- top-level transformation
-- replace this with manual recursion and you're set
replace :: Element -> Element
replace = everywhere (mkT replace')
example =
    Para [
        Text "1",
        Font [
            Text "2.1",
            Para [
                Text "2.2.1",
                Font [Text "2.2.2"]
            ]
        ],
        Text "3"
    ] 

在GHCi:中

[*Main]
> replace example
Loading package syb-0.3.6.1 ... linking ... done.
Para [Text "1",Para [Text "2.1",Para [Text "2.2.1",Para [Text "2.2.2"]]],Text "3"]
it :: Element

如果您想完全消除这些元素,您可以将所有内容映射到列表中,然后将它们连接起来。试着自己想办法。

最新更新