我正在大学学习 Haskell 的一门学科——这是我在业余时间完成的一个研讨会问题,你可能猜到我正在努力解决 Haskell 中的类型问题。我已经完成了这个问题,但没有公布答案,但我很想知道这是否是最好的方法。
这是问题中提供的 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_tag (Maybe Int) (Maybe String) (Maybe Font_color)
data Font_color
= Colour_name String
| Hex Int
| RGB Int Int Int
该问题要求构建一个 Haskell 函数“num_font_tags”,该函数将计算此类 HTML 表示中 font_tag 的所有实例。接下来是我的回答,我花了整整一个小时的头撞墙,但它编译得很好,我相信这是一个解决方案:
num_font_tags :: HTML -> Int
num_font_tags [] = 0
num_font_tags (x:xs) = num_font_tag_single x + num_font_tags xs
num_font_tags_list :: [HTML] -> Int
num_font_tags_list [] = 0
num_font_tags_list (x:xs) = num_font_tags x + num_font_tags_list xs
num_font_tag_single :: HTML_element -> Int
num_font_tag_single (HTML_text _) = 0
num_font_tag_single (HTML_font _ html) = num_font_tags html
num_font_tag_single (HTML_p html) = num_font_tags html
num_font_tag_single (HTML_ul html) = num_font_tags_list html
num_font_tag_single (HTML_ol html) = num_font_tags_list html
最初我以为我只需要第一个函数,但我遇到了问题,因为它只接受 HTML 类型,但后来我需要另外两个函数 - 一个接受 [HTML] 类型,一个接受 HTML_element 类型。
这真的是我需要做这个问题的方式吗?或者我是否因为拥有 3 个功能而太过分了。可以用一个来完成吗?我的主要问题是——我是否遗漏了一些关于 Haskell 本质的东西,这会使这变得更简单?