[Haskell-cafe] What is a rigid type variable?

Luke Palmer lrpalmer at gmail.com
Mon Jun 23 01:58:50 EDT 2008

On Mon, Jun 23, 2008 at 3:26 AM, Xiao-Yong Jin <xj2106 at columbia.edu> wrote:
> Hi all,
> I'm writing a short function as follows, but I'm not able to
> find a suitable type signature for `go'.  It uses
> Numeric.LinearAlgebra from hmatrix.
> -- | Map each element in a vector to vectors and thus form a matrix
> -- | row by row
> mapVecToMat :: (Element a, Element b) =>
>               (a -> Vector b) -> Vector a -> Matrix b
> mapVecToMat f v = fromRows $ go (d - 1) []
>    where
>      d = dim v
>      go :: Element b => Int -> [Vector b] -> [Vector b]
>      go 0 vs = f (v @> 0) : vs
>      go !j !vs = go (j - 1) (f (v @> j) : vs)

If you want to give a type signature for 'go', you need a GHC
extension called ScopeTypeVariables (IIRC).  The problem is that the
'b' in the signature of mapVecToMat is not the same b as the one in
'go'.  With this extension, you can put those variables into scope for
the body of the definition using explicit 'forall' quantifiers:

mapVecToMat :: forall a b. (Element a, Element b) =>
               (a -> Vector b) -> Vector a -> Matrix b
-- rest as before

But the Element b constraint is redundant in the signature of 'go',
since that constraint is already in place by the above signature.

As far as I can tell, giving an explicit signature for 'go' is not
possible without this extension.


More information about the Haskell-Cafe mailing list