where和if表达式的问题

时间:2013-11-02 15:21:06

标签: haskell

我想知道,为什么这不起作用(2错误):

removeCard cardList card e =
  if length $ (filter` cardList) == (length cardList)
  -- the same error 
  -- if length $ filter` cardList == length cardList
  -- if (length $ filter` cardList) == (length cardList)
  then error "The error occured"
  else filter` cardList
  where
    filter` [] = []
    filter` (x:xs) = if x == card then xs else x : filter` xs

如果我只使用类似if 1 == 2 ...的简单表达式替换if,我会收到另一个错误:

 parse error on input `where'

2 个答案:

答案 0 :(得分:3)

请勿在名称中使用反引号来过滤素数"。改为使用单引号:

  removeCard cardList card e =
    if length (filter' cardList) == (length cardList)
    -- the same error
    -- if length $ filter' cardList == length cardList
    -- if (length $ filter' cardList) == (length cardList)
    then error "The error occured"
    else filter' cardList
    where
      filter' [] = []
      filter' (x:xs) = if x == card then xs else x : filter' xs

反引号用于表示非符号函数名称的中缀表示法。

答案 1 :(得分:2)

反引号(`)不是标识符中的合法字符。它们用于将普通二进制函数编写为中缀运算符,如

(== card) `filter` cardList

您可能想要使用素数(')。

removeCard cardList card e =
  if length $ (filter' cardList) == (length cardList)
  then error "The error occured"
  else filter' cardList
  where
    filter' [] = []
    filter' (x:xs) = if x == card then xs else x : filter' xs