Reputation: 575
I'm using Haskell and trying to write the following:
data Scale s = Scale s s
However, I want to make it so that s
must be something that of the Num type class, like Int or Double. Is that possible to do using Haskell and GHC?
Upvotes: 23
Views: 10280
Reputation: 121
What about this:
data Scale' s = Scale s s
type Scale = Scale' Int Int
I did not try this, I do not know Haskell that well, just (mostly) reading about it, but it seems reasonable, isn't it? 🤔
Upvotes: 1
Reputation: 3790
I had a similar situation with Point
type. But I thought not about constraints, I thought about how to do generalizing element type of my point. Then I understood if I'll have point type like this data Point a = Point a a
then I can do it instance of Functor, Applicative, Foldable and Traversable. And I'll can design function by standart general way. For example:
dist :: Floating a => Point a -> Point a -> a
dist a b = sqrt $ sum $ (^2) <$> ((-) <$> a <*> b)
And I had question. What is going on? :) If I add constraint (as you asked) I would not can design by this way and I would need to implement a lot of functions like pointSub
.
So, there is something to think about :)
Upvotes: 9
Reputation: 152707
Yes:
{-# LANGUAGE GADTs #-}
data Scale s where
Scale :: Num s => s -> s -> Scale s
However, it's generally considered best practice not to do this. Instead, put the Num
constraint only on the functions that use Scale
s and need the Num
constraint. Being relaxed about such constraints allows you to temporarily break the invariant where appropriate; e.g. it's common to wish for a Functor
instance for such a type, which is impossible if you constrain the constructor as above.
Upvotes: 38