[英]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
的實現了。 您需要顯式的遞歸,映射和列表理解。 該函數需要Entries
和Grade
並返回與該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.