[英]Haskell how to use map to return a list?
我對如何返回數據類型中的某些內容的列表感到有些困惑。 我想我必須使用 map 函數,但不確定如何在這種情況下使用它。 例如,如果我有下面的數據類型(我知道很奇怪,但具體來說),我將如何編寫函數
makeList :: Car -> [Make]
makeList map f ???
返回輸入中所有汽車的品牌列表(如下所示),如果給出“makeList Tail”,則返回一個空列表 [ ] 。
data Car = Model Make Car | Tail
> makeList (Car Audi (Car Porsche Tail))
[Audi,Porsche]
> makeList Tail
[ ]
Car
類型與 Haskell 中專門用於Make
數據類型的列表等效(數學家會使用術語isomorphic )。 Haskell 列表定義為
data [a] = a : [a] | []
其中:
和[]
是構造函數。 如果我們給他們更多的人類可讀的名字,它可能更有意義
data List a = Cons a (List a) | Empty
我所做的只是將[a]
替換為List a
, :
替換為Cons
,將[]
替換為Empty
。 如果我們將其專門用於特定類型,例如Int
,我們將有
data List = Cons Int List | Empty
現在我們看到 Haskell 列表和你的Car
類型之間的相關性,只是Car = List
, Model = Cons
和Tail = Empty
。
您的makeList
函數實際上只是將Car
樣式列表轉換為[]
樣式列表, map
不是必需的(並且沒有用,因為它僅適用於[]
樣式列表)。 相反,您只需要進行正確的替換
makeList :: Car -> [Make]
makeList Tail = []
makeList (Car make nextCar) = ...
我不想放棄所有內容,因為這聽起來像是家庭作業,但此時您只需要讓makeList
的第二個子句遞歸地構建一個正常的[]
樣式列表。 同樣,重要的提示是“遞歸”和“ []
樣式列表”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.