私は大学の科目で 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
この質問では、そのような HTML 表現で font_tag のすべてのインスタンスをカウントする Haskell 関数 'num_font_tags' を作成するよう求めています。以下は私の答えです。頭を壁に突き合わせるのに約1時間かかりましたが、問題なくコンパイルされ、解決策であると思います。
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 型を受け入れる関数がさらに 2 つ必要でした。
それは私がこの質問をする必要があった方法ですか?それとも、3 つの機能を使用することで、やり過ぎているのでしょうか。1本で出来ますか?私の主な質問は、Haskell の性質について、これをより簡単にする何かが欠けているのでしょうか?