比方說,我定義我自己的數據類型一樣檢查特定數據構造
data MyData = A arg| B arg2| C arg3
我怎麼會寫一個函數(例如:isMyDataType
),檢查閹給定的參數是一個出來的MyData
中的特定類型並連續返回布爾值(True或False),例如在Ghci中輸入: isMyDataType B
返回True,isMyDataType Int
返回False。
比方說,我定義我自己的數據類型一樣檢查特定數據構造
data MyData = A arg| B arg2| C arg3
我怎麼會寫一個函數(例如:isMyDataType
),檢查閹給定的參數是一個出來的MyData
中的特定類型並連續返回布爾值(True或False),例如在Ghci中輸入: isMyDataType B
返回True,isMyDataType Int
返回False。
我相信你想要的功能來測試特定構造:
isA :: MyData -> Bool
isB :: MyData -> Bool
如果是這樣,那麼你可以將這些自己編寫或導出它們。實施將看起來像:
isA (A _) = True
isA _ = False
isB (B _) = True
isB _ = False
自動地得到它們,只需使用derive庫和添加,在源代碼:
{-# LANGUAGE TemplateHaskell #-}
import Data.DeriveTH
data MyData = ...
deriving (Eq, Ord, Show}
derive makeIs ''MyData
-- Older GHCs require more syntax: $(derive makeIs ''MyData)
另外請注意:你的數據聲明是無效的,該名稱必須大寫,MyData
而不是myData
。
最後,這整個答案是基於你想測試構造函數的假設,而不是你說的數據類型(在編譯時靜態檢查,如Tarrasch所說)。
Haskell總是檢查類型是否合理。如果編寫,編譯器會立即投訴,因爲4
不是MyData
類型,它的類型爲Int
。
我不確定這是你要求的,但是無論哪種方式,我強烈建議你在實踐中嘗試一下你在這裏提出的問題,這樣你就能親眼看到。最重要的是你在haskell中籤出類型簽名,這是學習haskell的關鍵。
Haskell是靜態類型的。這意味着所有類型系統相關的問題都可以在編譯時找到。 – fuz 2011-05-22 16:09:48