【问题标题】:Test if Haskell variable matches user-defined data type option测试 Haskell 变量是否匹配用户定义的数据类型选项
【发布时间】:2011-12-15 09:39:19
【问题描述】:

所以我有一个类似的数据类型:

data Token = NUM Int | ID String | EOF

我有一个类似的函数:

doStuff list = let
       (token, rest) = getToken list
   in
       ....

所以我想在... 部分做的是测试我得到的令牌是NUM 或INT 还是EOF。我可以说token==EOF 来测试这种情况,但我无法找到一种方法来使用条件测试令牌是NUM 还是INT,因为token==(NUM n) 和token==NUM 都导致错误。我知道我可以编写一个辅助函数来完成... 中的内容并利用模式匹配,但这确实损害了我正在做的事情的可读性,而且似乎应该有办法做到这一点查看。有人知道怎么做吗?

【问题讨论】:

    标签: haskell types typechecking


    【解决方案1】:

    你想要一个case 表达式,比如:

    case token of
        NUM n -> foo n
        ID s  -> bar s
        _     -> hoho
    

    这与单独定义函数时所获得的模式匹配相同。

    【讨论】:

      【解决方案2】:

      一个可爱的技巧是使用记录语法。这种方法的优点是即使特定构造函数的参数数量发生变化,它也能继续工作。请注意,数据类型本身无需使用记录语法声明即可利用此技巧。

      case token of
          NUM {} -> ...
          ID  {} -> ...
          EOF {} -> ...
      

      【讨论】:

      • @mergeconflict 如果你想要这些值,当然不要使用这个技巧。 =) 但是从这个问题听起来他只想检查使用了哪个构造函数。
      • @mergeconflict 你可以有选择地得到这样的 val:data Token = NUM { n,m :: Int} --- case tokenVal of Num {n=n'} -> foo n'
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多