[英]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.