测试Haskell变量是否与用户定义的数据类型选项匹配

时间:2011-10-26 00:49:45

标签: haskell types typechecking

所以我的数据类型如下:

data Token = NUM Int | ID String | EOF

我的功能类似于:

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

所以我想在...部分做的是测试我得到的令牌是NUM还是INT还是EOF。我可以说token==EOF来测试这种情况,但我无法找到一种方法来测试令牌是NUM还是INT使用条件,因为{{1} }和token==(NUM n)都会导致错误。我知道我可以写一个辅助函数来完成token==NUM中的东西并利用模式匹配,但这真的会伤害我正在做的事情的可读性,似乎应该有办法做这个检查。谁知道怎么做?

2 个答案:

答案 0 :(得分:12)

您需要case表达式,例如:

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

如果你单独定义一个函数,那就是你得到的那种模式匹配。

答案 1 :(得分:8)

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

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