Haskell测试实践困在表和映射函数上

dar*_*ton -1 mapping dictionary haskell filter

这是我的考试练习题中的问题:

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%]
Run Code Online (Sandbox Code Playgroud)

表格不是很清楚,因为我无法粘贴正确的表格,但您基本上可以看到有3列和多行,一个用于名称,一个用于等级,一个用于年龄.因此,您可以看到第一个问题"i"是定义一个适合表示此类表中信息的haskell类型.保持我的真正的桌子当然有线条.

那么如何定义一个函数来做到这一点?定义一个函数意味着例如"[String] - > String - > Int"还是我必须写一个能做某事的函数?

最后,关于avAGe找到人们的平均年龄,用映射函数做背后的想法是什么?我已经计划用于显式递归,但我真的很难适应映射函数(map,foldr,filter等).

bhe*_*ilr 6

一个合适的类型是每行具有数据类型,并且您可以使用现有的集合类型来保存多行.为了让你开始:

data Entry = Entry __________ deriving (Eq, Show)
type Entries = __________
Run Code Online (Sandbox Code Playgroud)

空白应该怎么做?它需要能够拥有一个名字,一个年级和一个年龄.因为Entries,您应该能够使用内置类型来存储所有这些行,可能是按顺序.

等级是否来自固定数量的有效值?然后您可以考虑使用ADT来表示它们:

data Grade
    = Trainee
    | Manager
    | Director
 -- | AnyOtherNameYouNeed
    deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

如果没有,那么你可以使用Strings,但我仍然会给它们一个名字:

type Grade = String
Run Code Online (Sandbox Code Playgroud)

现在您已经设置了类型,您可以开始实现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 = __________
Run Code Online (Sandbox Code Playgroud)

这应该可以帮助你开始,我只是不想给你答案,因为这是一个研究问题,而且总是更好地自己提出答案=)


所以现在你有

type Grade = String
type Entry = (String, Grade, Int)
type Entries = [Entry]
Run Code Online (Sandbox Code Playgroud)

从下面的评论中略微填写:

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 = __________
Run Code Online (Sandbox Code Playgroud)

你现在可以获得更多的空白吗?