假设我定义了自己的数据类型,如下所示
data MyData = A arg| B arg2| C arg3我该如何编写一个函数(例如:isMyDataType)来检查给定的参数是否是MyData中的特定类型之一,并连续返回布尔值(真或假),例如,在Ghci中输入:isMyDataType B返回真,isMyDataType Int返回假。
发布于 2011-05-23 00:06:05
我相信您希望函数测试特定的构造函数
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所说,数据类型是在编译时静态检查的)。
发布于 2011-05-22 23:50:56
Haskell总是检查类型是否有意义。如果你写了isMyDataType 4,编译器会立即报错,因为4不是MyData类型,而是Int类型。
我不确定这是不是你所要求的,但无论哪种方式,我都强烈建议你在实践中尝试你所要求的,这样你就可以自己看看了。最重要的是在haskell中查看类型签名,这是学习haskell的关键。
发布于 2019-06-09 01:50:49
您可以使用Maybe%s。您可以创建一组函数来检查每种类型
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}这为某些任务提供了一些实用的习惯用法:
allAs :: [MyData a] -> [a]
allAs xs = mapMaybe getA xs
printIfA :: Show a => MyData a -> IO ()
printIfA x = maybe (return ()) print $ getA xhttps://stackoverflow.com/questions/6088935
复制相似问题