假設我們在Haskell定義以下數據類型:計算所有有限Blurgs的無限列表
data Blurg = Blub
| Zarg
| Parg Blurg Blurg
這意味着Zarg
,Parg Blub (Parg Zarg Zarg)
,Parg (Parg Blub Blub) (Parg Blub Blub)
等,都是Blurgs
所有實施例。
現在舊試題如下:
定義一個用於計算所有Blurgs列表的功能。
所以,我想:
allBlurg' :: [Blurg] -> [Blurg]
allBlurg' sofar = sofar ++ allBlurg' [Parg x y | x <- sofar, y <- sofar]
allBlurg :: [Blurg]
allBlurg = allBlurg' [Blub, Zarg]
起初我以爲這是一個解決方案,但後來我意識到,不是所有可能Blurgs
都包含在結果列表allBlurg
。有人可以寫出適當的解決方案嗎順便說一下,我只想指出,問題所要求的不會是真正的函數,因爲它沒有任何參數;它應該被認爲是一個值。其次,雖然問題沒有明確說明,但我認爲這應該是每個Blurg
只在列表中出現一次的條件。另外請注意,這個問題實際上應該只是要求用戶zch在評論中提到的有限Blurgs。
我認爲這是不可能的。有不計其數的二叉樹。你的方法會生成所有有限的Blurg,但是沒有辦法將所有的無限Blurg都放入列表中。 – zch 2015-04-04 12:39:21
另一個問題是大多數Blurgs實際上是無法計算的,所以在Haskell中沒有辦法定義它們。 – zch 2015-04-04 12:48:32
@zch:我認爲有一個無限但數量可以的二叉樹數量,但無論哪種方式,我不認爲它在這裏是相關的。無論如何,想想這樣的問題:如果你給我一個任意的Blurg,它應該包含在列表中。 – Sid 2015-04-04 12:51:39