2011-05-22 61 views
14

比方說,我定義我自己的數據類型一樣檢查特定數據構造

data MyData = A arg| B arg2| C arg3 

我怎麼會寫一個函數(例如:isMyDataType),檢查閹給定的參數是一個出來的MyData中的特定類型並連續返回布爾值(True或False),例如在Ghci中輸入: isMyDataType B返回True,isMyDataType Int返回False。

+1

Haskell是靜態類型的。這意味着所有類型系統相關的問題都可以在編譯時找到。 – fuz 2011-05-22 16:09:48

回答

17

我相信你想要的功能來測試特定構造

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所說)。

+0

非常好!我不知道那個'TH'技巧。 – Tarrasch 2011-05-22 16:37:47

+0

如果你喜歡,那麼你應該看看派生和漂移的獨立使用。使用那些你可以做的事情,比如'deriving(Eq,Ord,Show { - !Is! - })'和cabal(或者你)將使用派生來執行一個源代碼到源代碼的轉換,並添加適當的函數。 – 2011-05-22 17:34:34

+0

是的,我的意思是說TomDM。 – kiltek 2011-05-22 18:46:16

1

Haskell總是檢查類型是否合理。如果編寫,編譯器會立即投訴,因爲4不是MyData類型,它的類型爲Int

我不確定這是你要求的,但是無論哪種方式,我強烈建議你在實踐中嘗試一下你在這裏提出的問題,這樣你就能親眼看到。最重要的是你在haskell中籤出類型簽名,這是學習haskell的關鍵。