简体   繁体   中英

Check if it is a specific type - haskell

I thought it would be really easy to find the answer online but I had no luck with that. Which means that my question should't be a question but I am sure more people new to Haskell might come up with the same question.

So how do I check if a value is of a certain type?

I have the following data type defined and I wanna check whether the input on a function is of a specific type.

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

First, your data declaration will not work. Let's assume you're using this type:

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

then you can have functions that take a MyType a , some specific MyType (eg MyType Int ) or a constrained MyType (eg Num a => MyType a ).

If you want to know whether you have a MyInt or a MyOther , you can simply use pattern matching:

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

When you want to know if the type in the parameter a is a Num , or what type it is, you will run into a fundamental Haskell limitation. Haskell is statically typed so there is no such dynamic checking of what the a in MyType a is.

The solution is to limit your function if you need a certain type of a . For example we can have:

mySum :: Num a => MyType a -> a
mySum (MyInt i) = fromIntegral i
mySum (MyOther n m) = n + mySum m

or we can have a function that only works if a is a Bool :

trueOrGE10 :: MyType Bool -> Bool
trueOrGE10 (MyInt i) = i >= 10
trueOrGE10 (MyOther b _) = b

As with all Haskell code, it will need to be possible to determine at compile-time whether a particular expression you put into one of these functions has the right type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM