在模式匹配中使用`++`

时间:2016-03-29 15:53:28

标签: haskell pattern-matching parse-error

将以下内容输入GHC解释器

let describe' all@([x] ++ [y]) = "The first letter of " ++ all ++ " is " ++ [x]

产量

  

模式中的分析器错误:[x] ++ [y]

为什么Haskell无法将模式all@([x] ++ [y])"HI"[1,2]等表达式匹配?

2 个答案:

答案 0 :(得分:9)

让我们假设您可以在++上进行模式匹配 - 现在想想如何匹配这个:

a ++ b = [1,2]
你可以:

  • a = [1,2]b = []
  • a = [1]b = [2]
  • a = []b = [1,2]

现在什么是正确的?

技术原因是++不是数据构造函数;)

在您的具体情况下,您可以使用

let describe' all@[x,y] = "The first letter of " ++ all ++ " is " ++ [x]

(只匹配长度完全 2的字符串)

或更好

let describe' all@(x:_) = "The first letter of " ++ all ++ " is " ++ [x]

(将匹配所有长度至少为1的字符串)

这是一个安全的版本

describe' :: String -> String
describe' ""        = "your input was empty"
describe' all@(x:_) = "The first letter of " ++ all ++ " is " ++ [x]

答案 1 :(得分:6)

您只能在模式匹配中使用构造函数。模式[x]涉及模式x:[],其中:[]都是构造函数。然而,++是一个功能。这是Haskell语言设计的一个小缺陷,因为我们无法快速区分我们定义为函数的符号和从它们的数据类型声明中获得的符号。如需完整治疗,请参阅section 3 of the Haskell 2010 Language Report