模式匹配 haskell

Pattern matching haskell

如果有人能给我提示模式匹配在 haskell 中应该如何工作,我将非常高兴。我已经花了几个小时观看不同的教程,但我不明白。

我有以下实例的数据类型赋值:

data Assignment = EmptyA | Assign String Integer Assignment
  deriving Show
myAssn = Assign "x" 1 (Assign "x" 2 (Assign "y" 3 EmptyA))

现在我想编写一个函数,该函数 return 向我发送给定字符串的数字。例如应该 lookupA myAssn "y" return 3:

lookupA :: Assignment -> String -> Integer
lookupA EmptyA _ = 0 
lookupA assn s = ???

您可能知道 Assignment 是一种递归数据结构,因为它可以保存自身的实例。要解决这个问题,就需要利用Assignment.

这个特性
data Assignment = EmptyA | Assign String Integer Assignment
   deriving Show

lookupA :: Assignment -> String -> Integer
lookupA EmptyA _ = 0 
lookupA (Assign name number nAssign) lookingFor
  | name == lookingFor = number
  | otherwise          = lookupA nAssign lookingFor


myAssn = Assign "x" 1 (Assign "y" 2 (Assign "z" 3 EmptyA))

这段代码的作用如下:

lookupA (Assign name number nAssign) lookingFor

它解构第一个参数并仅匹配 Assign 数据构造函数。使用 guards,它会检查这个 Assignment 的名称是否等于我们正在寻找的名称。如果是这样,它 returns 数字,否则,它递归地调用自己在此赋值内的赋值。基本情况当然是 EmptyA 数据结构。