Haskell无法匹配类型

时间:2017-02-26 02:11:06

标签: haskell

该计划假设与大学生打交道

data Etudiant = Etudiant CodePermanent Nom Prenom CodeProgramme deriving Show
data Inscription = Inscription CodePermanent Sigle NoGroupe CodeSession Date Date Note deriving (Show, Eq)

getCodePermanent :: Etudiant -> CodePermanent
getCodePermanent (Etudiant codePermanent _ _ _) = codePermanent

listeInscription :: Inscription -> Bool
listeInscription (Inscription _ _ _ codeSession _ _ _) = codeSession == 32003

filtreInscription1 :: [Inscription] -> [Inscription]
filtreInscription1 linscription = filter listeInscription linscription

getNoGroupe2 :: Inscription -> NoGroupe
getNoGroupe2 (Inscription _ _ noGroupe _ _ _ _) = noGroupe

numGroupesCoursEtu :: [Inscription] -> Etudiant -> [NoGroupe]
numGroupesCoursEtu listeInscr etu = map getNoGroupe2(filter (\x -> getCodePermanent(x) == getCodePermanent(etu)) listeInscr)

这里的功能的目标是从列表[铭文]中提取与会话代码32003匹配的列表[NoGroupe]和学生的ID:CodePermanent

我的最后一行代码给出了类型错误...你们能看到问题吗?

错误:

TP1.hs:115:54: error:
• Couldn't match type ‘Etudiant’ with ‘Inscription’
  Expected type: [Inscription]
    Actual type: [Etudiant]
• In the second argument of ‘map’, namely
    ‘(filter
        (\ x -> getCodePermanent (x) == getCodePermanent (etu))
        listeInscr)’
  In the expression:
    map
      getNoGroupe2
      (filter
         (\ x -> getCodePermanent (x) == getCodePermanent (etu)) listeInscr)
  In an equation for ‘numGroupesCoursEtu’:
      numGroupesCoursEtu listeInscr etu
        = map
            getNoGroupe2
            (filter
               (\ x -> getCodePermanent (x) == getCodePermanent (etu)) listeInscr)

TP1.hs:115:114: error:
• Couldn't match type ‘Inscription’ with ‘Etudiant’
  Expected type: [Etudiant]
    Actual type: [Inscription]
• In the second argument of ‘filter’, namely ‘listeInscr’
  In the second argument of ‘map’, namely
    ‘(filter
        (\ x -> getCodePermanent (x) == getCodePermanent (etu))
        listeInscr)’
  In the expression:
    map
      getNoGroupe2
      (filter
         (\ x -> getCodePermanent (x) == getCodePermanent (etu)) listeInscr)

第115行是代码numGroupesCoursEtu .....的最后一行.....

1 个答案:

答案 0 :(得分:0)

getCodePermanent :: Etudiant - > CodePermanent

请注意,getCodePermanent会将Etudiant作为参数。

(\x -> getCodePermanent(x) == getCodePermanent(etu))

据推测,您正在尝试检查Inscription是否与给定的CodePermanent具有相同的Etudiant。但正如我之前所说,getCodePermanentEtudiant作为参数。您需要编写另一个函数来从CodePermanent获取Inscription