Vlad Iordache
Vlad Iordache

Reputation: 528

"Type of many types" in Haskell

I'm totally new to functional programming and Haskell, so I am not sure I asked the question properly or if it makes sense, but I decided to try since I haven't found anything helpful. I'm basically trying to implement a function that can return an Int, a String, or a List. I know I can use Either to return one of two types, but I want to return one of three or more. I tried defining a new type, but I got stuck.

data Rets = Int | String | Bool

checkInt :: Rets -> Bool
check x = case x of
    Int x -> True

checkInt should return True if given an Int, it is just for testing but I included it anyway.

I'm aware that my question is a mess, so I would be thankful for any kind of explanation. Thanks in advance!

Upvotes: 1

Views: 125

Answers (1)

sepp2k
sepp2k

Reputation: 370415

You defined a type with three constructors that each take 0 arguments. So Int x wouldn't be a valid pattern for your type, it would just be Int -> true. Of course this also means that you can't store any values in your type, so it doesn't do what you want it to.

What you want is something like this:

data Rets = IntRet Int | StringRet String | BoolRet Bool

This defines three constructors named IntRet, StringRet and BoolRet, which take an Int, String and Bool respectively. This way you can construct values using IntRet 42, BoolRet True etc. and then pattern match them as IntRet x and so on.

Upvotes: 5

Related Questions