Haskell Lambda表达式和匹配类型

时间:2017-02-26 19:00:21

标签: haskell lambda

我需要一些帮助。在最后一行代码中我总是遇到类型匹配错误,但我不明白为什么'因为它似乎很好...... isGroupInscr(x)(y)返回true或false,我将它与True进行比较,因此没有不匹配... 你能给我一些建议吗? :)

isGroupInscr :: GroupeCours -> Inscription -> Bool
isGroupInscr sigleGroup sigleInscr =  getSigle(sigleGroup) /= getSigle2(sigleInscr)

filtreGroupInscr :: [GroupeCours] -> [Inscription] -> [GroupeCours]
filtreGroupInscr listGroupe listInscr = filter (\x y -> isGroupInscr(x)(y) == True) listGroupe

错误:

• Couldn't match expected type ‘Bool’
              with actual type ‘Inscription -> Bool’
• The lambda expression ‘\ x y -> isGroupInscr (x) (y) == True’
  has two arguments,
  but its type ‘GroupeCours -> Bool’ has only one
  In the first argument of ‘filter’, namely
    ‘(\ x y -> isGroupInscr (x) (y) == True)’
  In the expression:
    filter (\ x y -> isGroupInscr (x) (y) == True) listGroupe

由于

1 个答案:

答案 0 :(得分:0)

您需要部分申请

isGroupInscr :: GroupeCours -> Inscription -> Bool

获取具有类型

的函数
Inscription -> Bool 

可以与filter :: (a -> Bool) -> [a] -> [a]

一起使用 从函数类型

猜测,我认为你想要的是

isGroupInscr :: GroupeCours -> Inscription -> Bool
isGroupInscr sigleGroup sigleInscr =  getSigle sigleGroup /= getSigle2 sigleInscr

filtreGroupInscr :: [GroupeCours] -> [Inscription] -> [GroupeCours]
filtreGroupInscr (g:gs) (l:ls) = if isGroupInscr g l 
                                 then g : filtreGroupInscr gs ls
                                 else []
filtreGroupInscr _      _      = []

其他猜测

filtreGroupInscr listGroupe listInscr  
    = [g | g <- listGroupe , l <- listInscr, isGroupInscr g l]

另外,请注意,除非确实需要,否则您不必使用()来调用函数。 Haskell使用空间作为函数应用程序。

旁注:使用haskell undefined魔法,我可以在GHCi中加载不完整的代码来进行类型检查。

code test3.hs

data GroupeCours = GroupeCours
data Inscription = Inscription
data Single = Single deriving Eq

getSigle :: GroupeCours -> Single
getSigle = undefined

getSigle2 :: Inscription -> Single
getSigle2 = undefined

isGroupInscr :: GroupeCours -> Inscription -> Bool
isGroupInscr sigleGroup sigleInscr =  getSigle sigleGroup /= getSigle2 sigleInscr

filtreGroupInscr :: [GroupeCours] -> [Inscription] -> [GroupeCours]
filtreGroupInscr (g:gs) (l:ls) = if isGroupInscr g l 
                                then g : filtreGroupInscr gs ls
                                else []
filtreGroupInscr _      _      = []

filtreGroupInscr' :: [GroupeCours] -> [Inscription] -> [GroupeCours]
filtreGroupInscr' listGroupe listInscr  
    = [g | g <- listGroupe , l <- listInscr, isGroupInscr g l]

GHCi在行动

$ ghci
GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Loaded GHCi configuration from /data/works/dotfiles/ghci
Prelude> :l test3.hs
[1 of 1] Compiling Main             ( test3.hs, interpreted )
Ok, modules loaded: Main.
*Main> :t isGroupInscr 
isGroupInscr :: GroupeCours -> Inscription -> Bool
*Main> :t filtreGroupInscr
filtreGroupInscr :: [GroupeCours] -> [Inscription] -> [GroupeCours]
*Main> :t filtreGroupInscr'
filtreGroupInscr'
  :: [GroupeCours] -> [Inscription] -> [GroupeCours]