首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查特定的数据构造函数

检查特定的数据构造函数
EN

Stack Overflow用户
提问于 2011-05-22 23:35:12
回答 3查看 10.3K关注 0票数 17

假设我定义了自己的数据类型,如下所示

代码语言:javascript
复制
data MyData = A arg| B arg2| C arg3

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-23 00:06:05

我相信您希望函数测试特定的构造函数

代码语言:javascript
复制
isA :: MyData -> Bool
isB :: MyData -> Bool

如果是这样,那么您可以自己编写或派生它们。实现将如下所示:

代码语言:javascript
复制
isA (A _) = True
isA _     = False

isB (B _) = True
isB _     = False

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

代码语言:javascript
复制
{-# 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所说,数据类型是在编译时静态检查的)。

票数 23
EN

Stack Overflow用户

发布于 2011-05-22 23:50:56

Haskell总是检查类型是否有意义。如果你写了isMyDataType 4,编译器会立即报错,因为4不是MyData类型,而是Int类型。

我不确定这是不是你所要求的,但无论哪种方式,我都强烈建议你在实践中尝试你所要求的,这样你就可以自己看看了。最重要的是在haskell中查看类型签名,这是学习haskell的关键。

票数 1
EN

Stack Overflow用户

发布于 2019-06-09 01:50:49

您可以使用Maybe%s。您可以创建一组函数来检查每种类型

代码语言:javascript
复制
getA, getB, getC :: MyData a -> Maybe a
getA x = case x of {(A v) -> Just v; _ -> Nothing}
getB x = case x of {(B v) -> Just v; _ -> Nothing}
getC x = case x of {(C v) -> Just v; _ -> Nothing}

这为某些任务提供了一些实用的习惯用法:

代码语言:javascript
复制
allAs :: [MyData a] -> [a]
allAs xs = mapMaybe getA xs

printIfA :: Show a => MyData a -> IO ()
printIfA x = maybe (return ()) print $ getA x
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6088935

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档