On Friday 11 June 2010 07:47:03, Martin Drautzburg wrote: > On Friday, 11. June 2010 00:12:03 Daniel Fischer wrote: > > Thanks Daniel. > > > Upgrade. We're at 6.12 now! > > Did that. Everything is available now. > > I am still having trouble with the test function. First it seems I need > braces, so I can mix == and <*>. > test :: Num a > => (a -> a) -> (a -> a) -> (a -> a) -> [String] > test f g h = do > [f', g', h'] <- permutations [Named "f" f, Named "g" g, Named "h" h] > guard $ namedPure 42 == (f' <*> g' <*> h' <*> namedPure 42) > return $ show f' ++ " . " ++ show g' ++ " . " ++ show h' > > But this leads to > > Occurs check: cannot construct the infinite type: > a = (a -> a) -> a1 -> t > When generalising the type(s) for `test'
Ah, yes, (<*>) is left associative (infixl 4, hence you also need the parentheses since (==) is infix 4; same fixity and different associativities don't mix), here it must be associated to the right, namedPure 42 == (f' <*> (g' <*> (h' <*> namedPure 42))) :( If you'd want to use it a lot, define a right associative alias with higher fixity: infixr 5 <*< (<*<) = (<*>) > > This error message is still the maximum penalty for me (along with > "Corba marshall exception" in J2EE and "Missing right parenthesis" in > Oracle SQL) > > Then generally speaking, I have the feeling that this code does not > allow "namifying" existing code either. In this respect it does not seem > to do better than the "apply" method pattern discussed earlier in this > thread. You'd have to rewrite; either way. > > The problem it solves is very simple and therefore using (<*>) and > namedPure isn't much of a drawback. But if I had tons of code to namify > I would still have to do significant changes to it, right? Yes. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe