簡體   English   中英

通過構造函數比較值

[英]Comparing values by their constructors

我有一個這樣定義的數據類型:

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但總是在我需要比較構造函數時使用它對我來說似乎是重復的。 有什么聰明的解決辦法嗎? 例如像 function isKindOf Operator token之類的東西。

感謝user1984發布了這個問題的鏈接,我已經能夠找到一個解決方案:

{-# 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 "")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM