我现在正在做这个家庭作业,但我不知道。有人能帮我吗?
给定以下用于表示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
如果您想完全消除这些元素,您可以将所有内容映射到列表中,然后将它们连接起来。试着自己想办法。