所以我的数据类型如下:
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
中的东西并利用模式匹配,但这真的会伤害我正在做的事情的可读性,似乎应该有办法做这个检查。谁知道怎么做?
答案 0 :(得分:12)
您需要case
表达式,例如:
case token of
NUM n -> foo n
ID s -> bar s
_ -> hoho
如果你单独定义一个函数,那就是你得到的那种模式匹配。
答案 1 :(得分:8)
一个可爱的技巧是使用记录语法。这种方法的优点是即使特定构造函数的参数数量发生变化,它也会继续工作。请注意,不需要使用记录语法声明数据类型本身以利用此技巧。
case token of
NUM {} -> ...
ID {} -> ...
EOF {} -> ...