Am Dienstag 22 Dezember 2009 15:09:34 schrieb slemi:
> hello everybody, i'm a newbie this is my first post here..
>
> i have trouble making a function pointfree:
>
> data RealFrac a => Matrix a = Matr [[a]] | Scalar a
> deriving (Show, Eq)
>
> unMatr :: RealFrac a => Matrix a -> [[a]]
> unMatr = (\(Matr a) -> a)
>
> reMatr :: RealFrac a => ([[a]] -> [[a]]) -> (Matrix a -> Matrix a)
> reMatr a = Matr . (flip (.) unMatr) a
>
> this works fine, but if i leave the 'a' in the last function's definition
> like this:
> reMatr = Matr . (flip (.) unMatr)
> it gives an error. can anybody tell me why? (i'm using ghci)
You want
reMatr f = Matr . f . unMatr
= (.) Matr (f . unMatr)
= (.) Matr ((.) f unMatr)
= (.) Matr (flip (.) unMatr f)
= (.) Matr ((flip (.) unMatr) f)
= (((.) Matr) . (flip (.) unMatr)) f
So
reMatr = ((.) Matr) . (flip (.) unMatr)
Or, as I prefer it,
reMatr = (Matr .) . (. unMatr)
The point is that g = flip (.) unMatr [or (. unMatr)] takes two arguments, the
function f
and a matrix m, to yield an argument fitting for Matr, so we need to apply one
argument
before we can compose it with Matr, hence we compose it with (compose with
Matr) = (.)
Matr = (Matr .):
(Matr .) . g
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe