带元组的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",[])]