Haskell中如何判断自定义数据类型变量所属的构造子种类?
解决方案
Haskell中判断代数数据类型的构造子最直接的方式是模式匹配,有几种常用实现方式:
- 单独写判断函数,适合多处复用的场景
如果你只需要判断是否为Number构造子,可以写如下函数:
调用isNumber :: Token -> Bool isNumber (Number _) = True isNumber _ = FalseisNumber a就会返回True,传入Foo/Bar则返回False。 - 写取值函数,同时完成判断和取值
如果你后续需要用到构造子里的Int值,可以写返回Maybe Int的函数,避免二次模式匹配:
调用getNumber :: Token -> Maybe Int getNumber (Number n) = Just n getNumber _ = NothinggetNumber a会得到Just 20,你可以直接对这个Maybe值做后续处理,比如用fromMaybe 0 (getNumber a)给默认值,或者用case分支处理不同情况。 - 就地用case表达式处理
如果只需要单次判断,不需要复用逻辑,可以直接在使用位置写case分支:case a of Number n -> -- 这里n就是取出的Int值,可以直接做数值运算 _ -> -- 非Number构造子的处理逻辑
注意:你不能直接把Token类型的变量当做Int类型使用,必须通过模式匹配把Number构造子包裹的Int值取出后,才能对该Int值进行数值操作。
内容的提问来源于stack exchange,提问作者Paulo Rodrigues
相关产品推荐
相关产品推荐

