检查它是否是特定类型 - haskell

Rak*_*kim 1 haskell

我认为在网上找到答案真的很容易,但我没有运气.这意味着我的问题应该不是一个问题,但我相信更多Haskell新手可能会提出同样的问题.

那么如何检查某个值是否属于某种类型?

我定义了以下数据类型,我想检查函数的输入是否是特定类型.

data MyType a = MyInt Int | MyOther a (MyType a)

Sam*_*den 6

首先,您的data声明不起作用.我们假设你使用的是这种类型:

data MyType a = MyInt Int | MyOther a (MyType a)
Run Code Online (Sandbox Code Playgroud)

那么你可以拥有MyType a一些特定MyType(例如MyType Int)或约束MyType(例如Num a => MyType a)的函数.

如果你想知道你是否有a MyInt或a MyOther,你可以简单地使用模式匹配:

whichAmI :: MyType a -> String
whichAmI (MyInt i) = "I'm an Int with value " ++ show i
whichAmI (MyOther _ _) = "I'm something else"
Run Code Online (Sandbox Code Playgroud)

当你想知道参数中的类型a是a Num,或者它是什么类型时,你将遇到一个基本的Haskell限制.Haskell是静态类型的,因此没有动态检查ain MyType a是什么.

解决方案是在需要某种类型时限制您的功能a.例如,我们可以:

mySum :: Num a => MyType a -> a
mySum (MyInt i) = fromIntegral i
mySum (MyOther n m) = n + mySum m
Run Code Online (Sandbox Code Playgroud)

或者我们可以拥有一个仅在以下a情况下才有效的功能Bool:

trueOrGE10 :: MyType Bool -> Bool
trueOrGE10 (MyInt i) = i >= 10
trueOrGE10 (MyOther b _) = b
Run Code Online (Sandbox Code Playgroud)

与所有Haskell代码一样,需要能够在编译时确定放入这些函数之一的特定表达式是否具有正确的类型.