Reputation: 43
For example, i've got following function:
foo :: t -> f
foo var = foo' b var
where
b = bar 0.5 vect
and I need to specify literals' 0.5 type — 't'
If i write smth. like (0.5::t)
, GHC creates new type variable 't0', which is not corresponding to original 't'.
I've wrote a small function
ct :: v -> v -> v
ct _ u = u
and use it like this:
b = bar (ct var 0.5) d
Is there any better solution?
Upvotes: 4
Views: 232
Reputation: 122439
Without ScopedTypeVariables, the usual solution is to re-write b
into a function such that it takes in type t
and returns something containing type t
. That way, its t
is generic and independent of the outer t
and can be inferred based on where it is used.
However, without knowing the types of your foo'
and bar
, etc., I cannot tell you what exactly it will look like
Upvotes: 1
Reputation: 183888
You can use ScopedTypeVariables
to bring the type variables from the top-level signature into scope,
{-# LANGUAGE ScopedTypeVariables #-}
foo :: forall t. Fractional t => t -> f
foo var = foo' b var
where
b = bar (0.5 :: t) vect
Your helper function ct
is - with flipped arguments - already in the Prelude,
ct = flip asTypeOf
so
where
b = bar (0.5 `asTypeOf` var) vect
would work too.
Upvotes: 8