Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 哈斯克尔简单问题_Haskell - Fatal编程技术网

Haskell 哈斯克尔简单问题

Haskell 哈斯克尔简单问题,haskell,Haskell,我有两个问题: 一, 编写一个Haskell函数 strip_font_tags :: HTML -> HTML 这将删除所有字体标记,并将其替换为HTML内容 二, 写一个函数 print_mtree :: Show a => Mtree a -> IO() 打印一棵树。每个节点应打印在单独的行上。节点的子节点 应打印在后续行上,缩进比给出中值的行多一个空格 节点。例如,给定树 Mnode 1 [Mnode 2 [], Mnode 3 [Mnode 4 []]] 输出应

我有两个问题:

一,

编写一个Haskell函数

strip_font_tags :: HTML -> HTML
这将删除所有字体标记,并将其替换为HTML内容

二,

写一个函数

print_mtree :: Show a => Mtree a -> IO()
打印一棵树。每个节点应打印在单独的行上。节点的子节点 应打印在后续行上,缩进比给出中值的行多一个空格 节点。例如,给定树

Mnode 1 [Mnode 2 [], Mnode 3 [Mnode 4 []]]
输出应该是

1
 2
 3
  4
有人能帮我吗?非常感谢你

一些提示:

使用数据类型 键入HTML=[HTML\u元素] 数据元素 =HTML_文本字符串 |HTML\u字体\u标记HTML |HTML\u p HTML |HTML_ul[HTML] |HTML_ol[HTML] 数据字体标签=字体标签 我们想写一个函数,它可以

[HTML_font Font_tag [HTML_p [HTML_text "Hello"], HTML_p [HTML_text "world"]]
-- <font><p>Hello</p><p>world</p></font>
这与我们想要的类型相匹配,但它只会剥离最高层的HTML_字体元素,而不会剥离嵌套的标记。相反,我们可以使用递归继续对嵌套元素进行操作:

strip_font_element :: HTML_element -> [HTML_element]
-- note: concatMap f x == concat (map f x)
strip_font_element (HTML_font inner) = concatMap strip_font_element inner
strip_font_element any_other_element = [any_other_element]
不幸的是,这也不会完全奏效。我特别省略了实现细节,以递归其他类型的节点,特别是包含子节点的HTML\u p、HTML\u ul和HTML\u ol。你能想出如何执行这个递归吗

给定类型 数据树a=M节点a[M树a] 我们希望能够漂亮地打印出来,为更深的节点提供更多的缩进。为此,我们还将使用递归作为我们最喜欢的问题解决工具。首先,让我们尝试打印每个值,而不必担心留给读取器实现的缩进:

print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x []) = print x
首先,我们知道如果我们到达一个没有子节点的节点,我们不必再继续,只需打印x并停止。但是如果有子元素呢

print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x []) = print x
print_Mtree (Mnode x children) = do
    print x
    mapM_ print_Mtree children
这将使用函数mapM_,它执行一个单变量操作,并在返回IO之前将其应用于整个参数列表。但实际上,如果我们愿意,我们实际上不必担心基本情况,因为在空列表上使用mapM_u不会起任何作用:

print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x children) = do
    print x
    mapM_ print_Mtree children
现在要实现缩进,我们需要一个助手函数来跟上我们的深度:

print_Mtree_helper :: Show a => Int -> Mtree a -> IO ()
print_Mtree_helper level (Mnode x children) = ???

print_Mtree mtree = print_Mtree_helper 0 mtree

就这样

到目前为止你尝试了什么?这看起来很像一个你还没有解决的家庭作业问题。你能不能先发布你的代码以及任何错误消息或意外行为,以便我们可以帮助你处理代码?不是家庭作业,这是示例测试。这仍然是一个问题,你没有尝试解决它就发布了。Stackoverflow用于回答您在已经编写的代码中遇到问题的特定问题,而不是为问题陈述提供答案。如果您已经编写了代码,请将其添加到问题中。如果没有,我会鼓励你写一些代码,然后添加到你的问题中。这些不是问题,它们是工作指令。嘿,齐,Stackoverflow与大多数社区有点不同,它不像论坛之类的-只是纯粹的问答。不幸的是,社区并不总是非常欢迎和解释。。在我看来,这甚至是非常不幸的。所以我建议你先看看,然后再看看。附言:如果两个问题的相关性不足以称为两部分问题,你应该为每个问题创建一个问题,即使它紧跟在另一个问题之后。祝你好运,我一定热烈欢迎你!
print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x []) = print x
print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x []) = print x
print_Mtree (Mnode x children) = do
    print x
    mapM_ print_Mtree children
print_Mtree :: Show a => Mtree a -> IO ()
print_Mtree (Mnode x children) = do
    print x
    mapM_ print_Mtree children
print_Mtree_helper :: Show a => Int -> Mtree a -> IO ()
print_Mtree_helper level (Mnode x children) = ???

print_Mtree mtree = print_Mtree_helper 0 mtree