[英]How to do recursion for recursive data type in function in Haskell
我正在嘗試實現從自定義數據類型Page
返回所有標題的menu
function
data Page = Text String
| Title String [Page] deriving(Show)
menu :: Page -> [String]
menu (Text a) = []
menu (Title name content ) = [name]
但我也想要這個 function 也適用於頁面的一些“層次結構”,例如,像index
:
index = Title "Home" [
Title "Welcome!"[
Text "Hello World!",
Title "Lorem"[Text "ipsum"]],
Title "dolor"[
Title "no title" [Text "Haskell"],
Title "Look!" [Text "test"]],
Title "Finish" [Text "It will be look great"]]
我為此做了一些功能,但我不知道如何開始遞歸“層次結構” Page
menu :: Page -> [String]
menu (Text a) = []
menu (Title name content ) = [name]
output 是
*Main> menu index
["Home"]
但是我可以列出index
中的所有Title
嗎?
非常感謝您的回答!
一種方法如下:
data Page = Text String
| Title String [Page] deriving(Show)
menu :: Page -> [String]
menu (Text a) = [a]
menu (Title name content) = name : concatMap menu content
data Page = Text String
| Title String [Page] deriving(Show)
menu :: Page -> [String]
menu (Text a) = [a]
menu (Title name content) = name : concatMap menu content
一個小測試:
λ> menu index
["Home","Welcome!","Hello World!","Lorem","ipsum","dolor","no title","Haskell","Look!","test","Finish","It will be look great"]
我們正在使用concatMap
。
由於Text a
是葉子,我們將提取a
作為[a]
返回列表中的字符串,它是它的String
。
Title name content
有 2 個部分。 name
只是一個字符串,所以我們將它添加到列表中並遞歸調用menu
。 但是我們不能只是map
menu
over content
,因為 content 是Page
的列表。 這意味着我們有一個遞歸數據類型列表。 所以我們使用concatMap
來連接列表中每個Page
生成的列表。
如果您想跟蹤字符串是Title
還是Text
:
data Page = Text String
| Title String [Page] deriving(Show)
menu :: Page -> [String]
menu (Text a) = ["Text " ++ a]
menu (Title name content) = ("Title " ++ name) : concatMap menu content
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.