我正在嘗試實作menu從自定義資料型別回傳所有??標題的函式Page
data Page = Text String
| Title String [Page] deriving(Show)
menu :: Page -> [String]
menu (Text a) = []
menu (Title name content ) = [name]
但我也希望此功能也適用于頁面的某些“層次結構”,例如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]
輸出是
*Main> menu index
["Home"]
但是我可以列出所有Titleinindex 嗎?
非常感謝您的回答!
uj5u.com熱心網友回復:
一種方法如下:
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其String在串列中的提取物回傳為[a]。
Title name content有2個部分。name只是一個字串,所以我們將它添加到串列中并遞回呼叫menu. 但是我們不能就這樣map menu結束content,因為 content 是一個Pages的串列。這意味著我們有一個遞回資料型別串列。所以我們使用concatMap它只是連接由串列中的每個生成Page的串列。
如果您想跟蹤字串是 aTitle還是 a 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/370607.html
