重写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树会离开函数,以便它给出计算步骤及其结果的主要内容,如果未能解决你的问题,请参考以下文章