2011-05-22 60 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的关键。