簡體   English   中英

Haskell測試實踐卡在表和映射函數上

[英]Haskell Test Practice Stuck on Tables and Mapping Functions

這是我的考試練習卷中的問題:

The following table gives the names, grades and age of people employed by a 
company: 

Name       Grade     Age 
Able       Director  47 
Baker      Manager   38 
Charles    Trainee   19 
Dunn       Director  50 
Egglestone Manager   42 

i. Define a Haskell type suitable for representing the information in such a 
table [10%] 

A function avAge is required to find the average age of people in a given grade, 
for instance in the example the average age of managers is 40. Give three 
alternative Haskell definitions for this function: 

ii. using explicit recursion, [20%] 
iii. using mapping functions, [20%] 
iv. using list comprehensions. [20%]

該表不是很清楚,因為我無法粘貼正確的表,但是您基本上可以看到有3列和多行,一列用於名稱,一列用於年級,一列用於年齡。 因此,如您所見,第一個問題“ i”是定義適合於在此類表中表示信息的haskell類型。 請記住,實際表中當然有行。

那么我如何定義一個函數來做到這一點呢? 定義函數是否意味着例如“ [[String]-> String-> Int””,或者我必須編寫一個執行某些功能的函數?

最后,關於通過avAGe查找人們的平均年齡,使用映射功能執行此操作的背后想法是什么? 我已經計划進行顯式遞歸,但是我確實在努力使映射函數(map,foldr,filter等)適合於此。

一種合適的類型是每一行都有一個數據類型的類型,也許您可​​以使用現有的集合類型來保存多行。 首先開始:

data Entry = Entry __________ deriving (Eq, Show)
type Entries = __________

那么什么應該空白呢? 它需要能夠保留名稱,等級和年齡。 對於Entries ,您應該能夠使用內置類型來存儲所有這些行,大概是按順序存儲的。

等級是否來自固定數量的有效值? 然后,您可以考慮使用ADT來表示它們:

data Grade
    = Trainee
    | Manager
    | Director
 -- | AnyOtherNameYouNeed
    deriving (Eq, Show)

如果沒有,那么您可以只使用String ,但是我仍然給他們起一個名字:

type Grade = String

因此,既然您已經設置好類型,就可以使用avAge的實現了。 您需要顯式的遞歸,映射和列表理解。 該函數需要EntriesGrade並返回與該Grade匹配的年齡的平均值,因此類型簽名可能應該是

avAgeRec :: Entries -> Grade -> Double
avAgeRec entries grade = __________

avAgeMap :: Entries -> Grade -> Double
avAgeMap entries grade = __________

avAgeComp :: Entries -> Grade -> Double
avAgeComp entries grade = __________

這應該可以幫助您入門,我只是不想給您答案,因為這是一個學習問題,因此最好自己提出答案=)


所以現在你有了

type Grade = String
type Entry = (String, Grade, Int)
type Entries = [Entry]

並在下面的評論中添加了一些內容:

avAgeRec :: Entries -> Grade -> Double
avAgeRec entries grade = __________

avAgeMap :: Entries -> Grade -> Double
avAgeMap entries grade = <calculate average> $ map <get ages> $ filter <by grade> entries

avAgeComp :: Entries -> Grade -> Double
avAgeComp entries grade = __________

您現在可以填補更多空白嗎?

暫無
暫無

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

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