比方说,我定义我自己的数据类型一样检查特定数据构造
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