haskell - 通过构造函数比较值

标签 haskell algebraic-data-types

我的数据类型定义如下:

data Token
  = Literal Integer
  | Operator String
  | Separator Char
  | Identifier String

如果我有一个 Token 类型的值,是否有一种优雅的方法来检查其类型构造函数是否为例如运算符(operator)?或者甚至更多:有没有办法检查 Token 类型的两个值是否是同一构造函数的实例?

我显然可以创建函数:

isOperator :: Token -> Bool
isOperator (Operator _) = True
isOperator _ = False

haveSameConstructor :: Token -> Token -> Bool
haveSameConstructor (Literal _) (Literal _) = True
haveSameConstructor (Operator _) (Operator _) = True
haveSameConstructor (Separator _) (Separator _) = True
haveSameConstructor (Identifier _) (Identifier _) = True
haveSameConstructor _ = False

但是,这确实很冗长,尤其是当该类型具有更多构造函数时。或者我可以使用 case ... of 但当我需要比较构造函数时总是使用它对我来说似乎是重复的。有什么巧妙的解决办法吗?例如。类似于函数isKindOf Operator token

最佳答案

感谢user1984发布链接到 this question我已经找到了解决方案:

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data

data Token
  = Literal Integer
  | Operator String
  | Separator Char
  | Identifier String deriving (Show, Eq, Typeable)

sameConstructor :: Token -> Token -> Bool
sameConstructor a b = toConstr a == toConstr b

它不允许我检查某个值是否是特定构造函数的实例,但至少我可以通过比较两个值来替换它,如 sameConstructor token (Operator "") .

关于haskell - 通过构造函数比较值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70687495/

相关文章:

haskell - 在 happstack 中捕获纯函数的异常

haskell - "Pattern matching"代数类型数据构造函数

haskell - 如何在Haskell中列出sum类型的所有值

haskell - ADT 名称。什么是 `Left a` ,然后是什么 `a` ,在 Haskell 中?

list - 给定一个字符串,获取元组列表(字符,字符连续出现多少次)-Haskell

haskell - 使用保护和切片

haskell - "deriving Functor"究竟是做什么的?

haskell - 在 Num 或 Rational 中的 Haskell 中的环的单位

Haskell:在代数数据类型上有没有 'mapping' 的方法?

haskell - 类型代数和 Knuth 向上箭头表示法