我尝试从这个结构中创建随机树:
data Tree a = Leaf a
| Funktion (Tree a) (Tree a)
| Lambda (Tree a)
deriving (Show)
我遇到的问题是我甚至不知道如何生成具有(例如)2的深度的树,其仅具有“Lambda”作为节点。如果有人可以帮助我生成这个简单的树(深度2),我可以随机生成它们。 如果我实现这样的函数:
build (Tree a) 0 = Leaf "A"
build (Tree a) n = build (Lambda a) (n-1)
它不起作用,因为函数构建本身期望树作为输入。实际上我需要具有Lambda或Funktion节点的树,但首先我需要了解如何生成这个结构的简单版本。
答案 0 :(得分:2)
听起来你想要像
这样的东西build :: Natural -- ^ Number, n, of Lambda nodes
-> a -- ^ Value, v, to store in the Leaf
-> Tree a -- ^ Lambda^n (Leaf v)
build 0 a = Leaf a
build n a = Lambda (build (n - 1) a)
这样build 4 "A"
将产生
Lambda (Lambda (Lambda (Lambda (Leaf "A"))))
不幸的是,你的其余问题(关于生成随机树)确实需要更多的背景来回答。
答案 1 :(得分:0)
你已经关闭了 - 你的build
函数此刻总是返回Leaf
,因为递归的基本情况不会做任何事情与其参数。你实际上并不需要这个论点:
build :: Integer -> Tree String
build 0 = Leaf "A"
build n = Lambda $ build (n-1)
这将产生您的build
函数似乎意图的内容,即由n
节点和Leaf
节点组成的给定深度Lambda
的简单“树” 。例如:
λ> build 2
Lambda (Lambda (Leaf "A"))
要获取随机生成的树,您需要查看System.Random
模块。
例如,建立在前一个树上,在给定的上限和下限之间的随机高度的树:
buildRandom :: (Integer, Integer) -> IO (Tree String)
buildRandom bounds = randomRIO bounds >>= return . build
这可以扩展和修改以产生你想要的行为(一个完全随机生成的树),但需要知道monad等,这可能需要一些额外的阅读。