Paul Hooks
Paul Hooks

Reputation: 43

'Where' function type in Haskell

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

Answers (2)

newacct
newacct

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

Daniel Fischer
Daniel Fischer

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

Related Questions