簡體   English   中英

如何對 Haskell 中的 function 中的遞歸數據類型進行遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM