2015-09-27 46 views
-3

我對如何返回數據類型的東西列表有點困惑。我想我必須使用地圖功能,但我不確定如何在這種情況下使用它。舉例來說,如果我有下面的數據類型(奇怪,我知道,但是這個具體),我將如何編寫一個函數Haskell如何使用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 
    [ ] 
+4

這至少是我最近看到的第二個問題,它有[tag:dictionary]標籤,但與字典無關。我很好奇,如果你有任何的洞察力,爲什麼可能會發生。 – dfeuer

+1

請不要編輯您的問題,以刪除重要的信息,如「汽車」的定義。我已恢復您的編輯。 –

回答

5

Car類型等效(數學家將使用術語同構),以在Haskell列表專門到Make數據類型。 Haskell的列表被定義爲

data [a] = a : [a] | [] 

:[]是構造函數。如果我們給他們更多的人類可讀的名字它可能會更有意義

data List a = Cons a (List a) | Empty 

所有我所做的是List a替代[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第二個子句遞歸構建一個正常的[]樣式列表。再次,大提示是「遞歸」和「[]風格列表」。

相關問題