List Haskell:比较元组列表中的元素
项目说明: 如果给定了一个包含5个元素元组的列表(例如,List Haskell:比较元组列表中的元素,list,haskell,comparison,tuples,List,Haskell,Comparison,Tuples,项目说明: 如果给定了一个包含5个元素元组的列表(例如,[(String,Int,String,Int,Int)]),那么元组的第一个元素表示工人的姓名,第四个元素表示他/她的工资支票,我必须创建一个函数(称为biggestPay)来给出工资最高的工人的姓名 限制: 根据《学好哈斯克尔》一书,我只能使用(包括)高阶函数和前奏函数 我迄今为止的作品: getPay :: (String,Int,String,Int,Int) -> Int getPay (_,_,_,a,_) = a g
[(String,Int,String,Int,Int)]
),那么元组的第一个元素表示工人的姓名,第四个元素表示他/她的工资支票,我必须创建一个函数(称为biggestPay
)来给出工资最高的工人的姓名
限制:
根据《学好哈斯克尔》一书,我只能使用(包括)高阶函数和前奏函数
我迄今为止的作品:
getPay :: (String,Int,String,Int,Int) -> Int
getPay (_,_,_,a,_) = a
getName ::(String,Int,String,Int,Int) -> String
getName (a,_,_,_,_) = a
getPayList :: [(String,Int,String,Int,Int)] -> String
getPayList [] = []
getPayList xs = [ x | y <- [0..(length xs)-1] ,
if getPay(getPayList y:xs) >= getPay(getPayList (y+1):xs)
then x is getName(getPayList y:xs)
else x is getName(getPayList (y+1):xs)]
biggestPay :: [String] -> String
biggestPay [] = []
biggestPay xs = drop ((length xs) -1) xs
x是…
不是有效的Haskell语法,但您可以像这样使用let
:
getPayList (x:xs) = [ x | y <- [...]
, let x = if ... then ... else ... ]
Haskell将其解释为
getPay( (getPayList y) : xs)
它不进行类型检查,因为y是整数,getPayList
对元组列表进行操作
提示
看看LYAH如何引入最大值功能:
也许该函数有一个简单的调整,它将为您提供
biggestPay
函数。Hum我似乎无法理解该调整,但例如,如果我首先使用getName从工作中删除所有名称,则它们将使用getPay删除所有工资支票,然后使用列表上的最大值(使用getPay创建)包含所有的工资单,获取该号码的索引,然后返回具有相同索引的姓名,这样做有效吗?或者我把事情搞得太复杂了?如果你只是更改我标记为“更改这行”的那一行,你将拥有一个函数[(String,Int,String,Int,Int)]->(String,Int,String,Int,Int)
,它返回报酬最大的元组。是什么意思?
getPay(getPayList y:xs)
getPay( (getPayList y) : xs)
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs)
| x > maxTail = x -- change this line
| otherwise = maxTail
where maxTail = maximum' xs