Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.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_Tree - Fatal编程技术网

重写Haskell树叶函数,以便给出其计算步骤和结果

重写Haskell树叶函数,以便给出其计算步骤和结果,haskell,tree,Haskell,Tree,我的任务是重写树数据类型的两个Haskell函数,以便它们也给出它们的计算步骤。 功能是 leaves :: Tree a -> [a] leaves Nil = [] leaves (Leaf a) = [a] leaves (Br l r) = leaves l ++ leaves r 及 数据类型为 data Tree a = Leaf a | Br (Tree a) (Tree a)| Nil

我的任务是重写树数据类型的两个Haskell函数,以便它们也给出它们的计算步骤。 功能是

leaves :: Tree a -> [a]
leaves Nil   = []
leaves (Leaf a) = [a]
leaves (Br l r) = leaves l ++ leaves r

数据类型为

data Tree a = Leaf a              |
              Br (Tree a) (Tree a)|
              Nil
                deriving Show
我甚至不知道如何开始

我甚至不知道如何开始

我将首先定义你所说的给出他们的计算步骤是什么意思。您的程序是否应该以特定格式打印某些输出

下一步你应该做的是决定新类型的叶子应该是什么。由于不知道第一个问题的答案,一种可能性是:

leaves :: Tree a -> ([ComputingStep], [a])
或者您可能需要返回与叶元素交错的步骤?:

leaves :: Tree a -> [Either ComputingStep a]

从这里开始,从你的基本情况开始,从那里开始。您可能想看看类似于splitAt from Data的函数。请列出一个返回元组的递归函数的示例以获取灵感。

从注释中,我猜您只需要了解您进行了多少次函数调用。您可以用非常简单的方式将它们相加:

leaves :: Tree a -> (Int, [a])
leaves''' Nil = (1, [])
leaves''' (Leaf a) = (1, [a])
leaves''' (Br l r) = let (n1, resl) = leaves''' l
                         (n2, resr) = leaves''' r
                     in (n1 + n2 + 1, resl ++ resr)

和第二个变量类似,您可以使用。据我所知,我需要函数给出其正常结果,以及终止/达到此结果所需的步骤数。而且我认为你的第一种类型更正确,因为我也倾向于这样。好吧,如果你想输出步骤数,那么合适的类型可能是:Tree a->Int,[a]是的,这似乎是对的,将步骤作为空列表和一个叶子的输出应该很容易,因为据我所知,它们都应该是一个,所以我所要做的就是把它们改成[],1和[a],1,但我在做最后一部分时遇到了麻烦,离开l++离开r,因为我仍然需要弄清楚这需要多长时间,以及如何正确地适应类型。请按照我的建议看一下splitAt。我想你能弄明白。您试图将以下内容转换为代码:分支的叶是右分支和左分支的步骤之和,是右分支和左分支的叶的串联。你要做的是:让stepsLeft,leavesLeft=离开l。。。在…谢谢你的帮助,但我一直收到相同的类型错误,我仍然不知道函数需要多长时间才能终止,甚至在我进入第二个函数之前,所以我想我要放弃了。也许是因为我最近错过了一系列的讲座,或者是我不适合计算机科学。尽管你帮了很多忙,但还是要谢谢你。如果你在围棋中使用累加器,你为什么还要在Br的情况下使用树叶呢?@gallais我的天,我的错误。固定的谢谢我仍然不确定累加器的意义是什么:在基本情况下,你可以简单地使用1,[]和1,[a],在分支情况下使用n1+n2+1,resl++resr。是的,没有必要,我只是更习惯于这种风格。我将重写我的答案,因为在这种情况下,它是矫枉过正的
leaves :: Tree a -> (Int, [a])
leaves''' Nil = (1, [])
leaves''' (Leaf a) = (1, [a])
leaves''' (Br l r) = let (n1, resl) = leaves''' l
                         (n2, resr) = leaves''' r
                     in (n1 + n2 + 1, resl ++ resr)