
On Mon, Jun 23, 2008 at 3:26 AM, Xiao-Yong Jin
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. Luke