检查特定的数据构造函数

kil*_*tek 14 haskell types typechecking

假设我定义了自己的数据类型

data MyData = A arg| B arg2| C arg3
Run Code Online (Sandbox Code Playgroud)

我如何编写一个函数(例如isMyDataType:)来检查给定的参数是否是特定类型中的一个MyData并连续返回一个布尔值(True或False),例如输入Ghci: isMyDataType B返回True并isMyDataType Int返回False.

Tho*_*son 20

我相信你想要函数来测试特定的构造函数:

isA :: MyData -> Bool
isB :: MyData -> Bool
Run Code Online (Sandbox Code Playgroud)

如果是这样,那么你可以自己编写或者派生它们.实现看起来像:

isA (A _) = True
isA _     = False

isB (B _) = True
isB _     = False
Run Code Online (Sandbox Code Playgroud)

要自动派生它们,只需使用派生库并在源代码中添加:

{-# LANGUAGE TemplateHaskell #-}
import Data.DeriveTH

data MyData = ...
    deriving (Eq, Ord, Show}

derive makeIs ''MyData
-- Older GHCs require more syntax: $( derive makeIs ''MyData)
Run Code Online (Sandbox Code Playgroud)

另请注意:您的数据声明无效,名称必须大写,MyData而不是myData.

最后,整个答案基于您想要测试构造函数的假设,而不是您所说的数据类型(在编译时静态检查,如Tarrasch所说).