我认为在线找到答案真的很容易,但我没有运气。这意味着我的问题应该是一个问题,但我相信更多Haskell新手可能会提出同样的问题。
那么如何检查某个值是否属于某种类型?
我定义了以下数据类型,我想检查函数的输入是否属于特定类型。
data MyType a = MyInt Int | MyOther a (MyType a)
答案 0 :(得分:6)
首先,您的data
声明无效。我们假设您使用的是此类型:
data MyType a = MyInt Int | MyOther a (MyType a)
然后您可以使用MyType a
,某些特定MyType
(例如MyType Int
)或约束MyType
(例如Num a => MyType a
)的函数。< / p>
如果您想知道自己是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是静态类型的,因此没有动态检查a
中的MyType 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代码一样,需要可以在编译时确定放入这些函数之一的特定表达式是否具有正确的类型。