我有這樣的資料型別:
data Token = Foo | Bar | Number Int deriving (Show, Eq)
還有一個變數:
a = Number 20
我如何測驗這個變數是否是一個數字?它的型別是 Token,但我想看看它是否可以用作 int。
uj5u.com熱心網友回復:
您使用模式匹配。舉個例子,這里有一個簡單的謂詞,True如果它是由創建的值,則回傳Number,False否則回傳。
isNumber :: Token -> Bool
isNumber (Number _) = True
isNumber _ = False
uj5u.com熱心網友回復:
@Chepner 已經給出了如何測驗一個Token值是否使用Number建構式。但是我覺得關于如何從中提取Int值可以說更多,當你說你“想看看它是否可以作為一個整數作業”時,這似乎是你想要的。因為如果您使用 chepner 的isNumber函式并且它回傳True,那么如果沒有Int再次進行模式匹配,您將無法得到它。所以你不妨將這兩個步驟合二為一。
這是一個簡單的方法:
getNumber :: Value -> Maybe Int
getNumber (Number n) = Just n
getNumber _ = Nothing
注意這里的型別——這個函式不能回傳 anInt因為你不知道你正在測驗的值包含一個!*還要注意它與isNumber函式的結構有多相似——這仍然讓你很容易做到不同情況下的不同事情,像這樣
case (getNumber someValue) of
Just n -> - - do something with n
Nothing -> - - handle the other cases
請注意,這假設您希望以相同的方式處理所有非數字建構式。如果你想對每個做一些不同的事情,那么你不需要getNumber或者isNumber可以直接模式匹配someValue并在每種情況下做你需要的任何事情。
*在這種情況下,您可能希望提供一個默認值,例如 0。但即便如此,我仍建議使用getNumber上面相同的函式并將其與庫函式結合使用fromMaybe- 即getWithDefault = fromMaybe 0 . getNumber.
uj5u.com熱心網友回復:
資料型別本身已經告訴您它是什么。所以,你使用它作為Int這樣的:
foo :: (Int -> r) -> Token -> Maybe r
foo f (Number i) = Just (f i)
foo _ _ = Nothing
如果是Int,我們就使用它;否則,我們不會。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387038.html
標籤:哈斯克尔
