簡體   English   中英

Haskell 如何使用 map 返回一個列表?

[英]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 = ListModel = ConsTail = Empty

您的makeList函數實際上只是將Car樣式列表轉換為[]樣式列表, map不是必需的(並且沒有用,因為它僅適用於[]樣式列表)。 相反,您只需要進行正確的替換

makeList :: Car -> [Make]
makeList Tail = []
makeList (Car make nextCar) = ...

我不想放棄所有內容,因為這聽起來像是家庭作業,但此時您只需要讓makeList的第二個子句遞歸地構建一個正常的[]樣式列表。 同樣,重要的提示是“遞歸”和“ []樣式列表”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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