带元组的Haskell列表
输出为 我的尝试:带元组的Haskell列表,haskell,Haskell,输出为 我的尝试: [("maths",["john","ron","sam"]),("science",["john"]),("chemistry",["ron"]),("french",[])] 谁能告诉我我做错了什么吗。我遇到了一个错误:在输入nlist上解析错误一个问题是,您正在将一个元组列表传递给一个需要一个元组的函数。看起来您要做的是: 在累积关联列表中查找与主题匹配的条目 获取该科目已有学生的列表(如果不存在此类关联,则获取空列表) 创建添加了当前学生姓名的新学生列表 生成由主
[("maths",["john","ron","sam"]),("science",["john"]),("chemistry",["ron"]),("french",[])]
谁能告诉我我做错了什么吗。我遇到了一个错误:在输入nlist上解析错误一个问题是,您正在将一个元组列表传递给一个需要一个元组的函数。看起来您要做的是:
- 在累积关联列表中查找与主题匹配的条目
- 获取该科目已有学生的列表(如果不存在此类关联,则获取空列表)
- 创建添加了当前学生姓名的新学生列表
- 生成由主题和新学生列表组成的新关联
- 创建一个新关联列表,用新关联替换旧关联
- 将新的关联列表传递到折叠的下一个迭代
- 写出类型!下面是一个如何使用类型构造程序的示例。之后,我将向您展示如何使用类型来修复您自己的程序
nlist = foldl'(\ (subjectname,studentname) (x,y) ->
if(x `elem` subjectname)
then (subjectname,studentname++[y])
else (subjectname,studentname) ) subject marks
显然你已经明白了
type Subject = String
type Person = String
insertOne :: (Subject, Person) -> [(Subject, [Person])] -> [(Subject, [Person])]
insertMany :: [(Subject, [Person])] -> [(Subject, Person)] -> [(Subject, [Person])]
subject :: [(Subject, [Person])]
marks :: [(Subject, Person)]
nlist = insertMany subject marks
它仍然需要实现insertOne
:
insertMany = foldr insertOne
请注意,写出类型有助于编写正确的程序。
要了解程序无效的原因,请尝试写出以下类型:
insertOne (subject, person) =
map (\(subject',list) -> if subject' == subject
then (subject', person:list)
else (subject', list))
x元素subjectname
没有意义,因为subjectname
不是字符串的列表。它应该是x==subjectname
,否则这是一个很好的函数李>
foldl f
将具有类型(主题,[人]->[(主题,人)]->[(主题,人)]
此程序只能更新一个主题,例如
f :: (Subject, [Person]) -> (Subject, Person) -> (Subject, [Person])
f = (\ (subjectname,studentname) (x,y) ->
if(x `elem` subjectname)
then (subjectname,studentname++[y])
else (subjectname,studentname) )
您现在需要的是通过map
,将此应用于每个主题:
foldl f ("maths",[]) marks == ("maths",["john","ron","sam"])
请如果您收到错误消息,还应包括错误消息;如果预期结果与实际结果不同,则应包括预期结果和实际结果。您确定input nlist上的parse error就是您收到的错误吗?当我试图在GHCi中定义这些表达式时,这不是我遇到的编译器错误。
foldl f ("maths",[]) marks == ("maths",["john","ron","sam"])
map (\x -> foldl f x marks) subject == [("maths",["john","ron","sam"]),("science",["john"]),("chemistry",["ron"]),("french",[])]