我有一個這樣定義的資料型別:
data Token
= Literal Integer
| Operator String
| Separator Char
| Identifier String
如果我有一個 type 的值Token,有沒有一種優雅的方法來檢查它的型別建構式是否是 eg 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。
uj5u.com熱心網友回復:
感謝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 "")。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411551.html
標籤:
