模式匹配 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
数据结构。
如果有人能给我提示模式匹配在 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
数据结构。