[英]Check if it is a specific type - haskell
我认为在网上找到答案真的很容易,但是我对此并不走运。 这意味着我的问题不应该是一个问题,但是我敢肯定,更多对Haskell陌生的人可能会提出相同的问题。
那么,如何检查某个值是否属于某种类型?
我定义了以下数据类型,我想检查函数的输入是否为特定类型。
data MyType a = MyInt Int | MyOther a (MyType a)
首先,您的data
声明将不起作用。 假设您使用的是这种类型:
data MyType a = MyInt Int | MyOther a (MyType a)
那么您可以使用采用MyType a
,某些特定MyType
(例如MyType Int
)或受约束的MyType
(例如Num a => MyType a
) Num a => MyType a
。
如果你想知道你是否有一MyInt
或MyOther
,你可以简单地使用模式匹配:
whichAmI :: MyType a -> String
whichAmI (MyInt i) = "I'm an Int with value " ++ show i
whichAmI (MyOther _ _) = "I'm something else"
当您想知道参数a
的类型是Num
还是什么类型时,就会遇到基本的Haskell限制。 Haskell是静态类型的,因此无法对MyType a
的a
进行动态检查。
解决的办法是,如果你需要某种类型的限制你的功能a
。 例如,我们可以有:
mySum :: Num a => MyType a -> a
mySum (MyInt i) = fromIntegral i
mySum (MyOther n m) = n + mySum m
或者我们可以有一个仅在a
是Bool
时才起作用的函数:
trueOrGE10 :: MyType Bool -> Bool
trueOrGE10 (MyInt i) = i >= 10
trueOrGE10 (MyOther b _) = b
与所有Haskell代码一样,有必要在编译时确定放入这些函数之一的特定表达式是否具有正确的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.