【问题标题】:Pattern matching haskell模式匹配haskell
【发布时间】:2021-10-21 06:20:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: haskell pattern-matching


    【解决方案1】:

    您可能知道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 数据构造函数。 using 守卫,它检查这个Assignment 的名称是否与我们正在寻找的相同。如果是,则返回该数字,否则,它会在此分配中的分配上递归调用自身。基本情况当然是EmptyA 数据结构。

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 2021-05-22
      • 2017-05-08
      • 2019-03-01
      • 2016-10-29
      • 2017-10-12
      • 2011-11-30
      • 2019-05-17
      • 2012-10-04
      相关资源
      最近更新 更多