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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With