重写Haskell树会离开函数,以便它给出计算步骤及其结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写Haskell树会离开函数,以便它给出计算步骤及其结果相关的知识,希望对你有一定的参考价值。

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

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

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

数据类型是

data Tree a = Leaf a              |
              Br (Tree a) (Tree a)|
              Nil
                deriving Show

我甚至不知道如何开始

答案

我甚至不知道如何开始

我首先要通过“给出他们的计算步骤”来定义你的意思。您的程序是否应该以特定格式打印某些输出?

接下来你应该做的是决定新型leaves应该是什么。不知道第一个问题的答案,一种可能性是:

leaves :: Tree a -> ([ComputingStep], [a])

或者你可能需要返回与叶元素交错的“步骤”?:

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

从这里开始,从你的基础案例开始,然后从那里开始。你可能想看看像splitAt这样的Data.List函数的灵感(一个返回元组的递归函数的例子)。

另一答案

从评论我猜你只需要信息你做了多少函数调用。你可以用非常简单的方式总结它们:

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)

(以类似方式的第二个变体)

以上是关于重写Haskell树会离开函数,以便它给出计算步骤及其结果的主要内容,如果未能解决你的问题,请参考以下文章

如何重写我的 swift 代码,以便它还考虑计算两个日期之间的差异,当一个日期在未来时?

Haskell学习-常见排序算法汇总

在Haskell中扩展数据类型

Haskell入门篇三:递归

Haskell学习-monad

在Haskell中插入排序