代码之家  ›  专栏  ›  技术社区  ›  user8314628

如何检查输入是否为特定类型?

  •  -3
  • user8314628  · 技术社区  · 6 年前
    data Term = TNull            -- null term
              | TBool Bool       -- boolean data
              | TInt Int         -- integer data
              | TSymbol String   -- symbolic data
              | TPair Term Term  -- pairs
              | TVar LVar        -- logic variable
              deriving (Show, Eq, Ord)
    
    walk :: Term -> Substitution -> Term
    walk term substitution = undefined
    
    type Substitution = Map.Map LVar Term
    

    我想检查一下 term 是逻辑变量。

    如果它不是逻辑变量或不在替换映射中,则返回它。否则,递归调用walk来查看替换是否映射另一个逻辑变量。我如何实现它?


    正如Ajfarmar提到的,我在上面尝试了模式匹配。

    walk TVar substitution = if substitution Tvar
        walk (substitution Tvar) substitution
    walk _ substitution = TVar
    

    但似乎不起作用。

    1 回复  |  直到 6 年前
        1
  •  2
  •   castletheperson    6 年前

    使用模式匹配:

    walk :: Term -> Substitution -> Term
    walk term@(TVar lvar) sub = Map.findWithDefault term lvar sub
    walk (TPair term1 term2) sub = TPair (walk term1 sub) (walk term2 sub)
    walk term _ = term