Thank you. That's just what I needed. And your second version shows that I needn't use an anonymous function (lambda expression) at all, something that got lost in translation from Lisp to Haskell.
First, yes, there was a typo. I couldn't find the original message so had to rewrite. Second, the reason I switched to a tuple argument in the first place is that I read somewhere, "Real World Haskell" I think, that Haskell anonymous functions could only have a single parameter (\ n -> ...). Maybe I didn't read far enough or Haskell has since been updated. Then, one poster didn't like the use of a (tuple) argument because it couldn't be partially applied, but the whole point of anonymous functions is for one off stuff, like these verifiers, where one doesn't want to create a named function that's used just once. In any case, the function we pass to makeVerifier, whether anonymous or in the WHERE of your clarified version, is a function that only appears in the definition of a particular verifier, so what difference can it possibly make whether or not it can be partially applied? That's what I can't get my head around. Thanks again. Michael --- On Sun, 4/12/09, Ross Mellgren <[email protected]> wrote: From: Ross Mellgren <[email protected]> Subject: Re: [Haskell-cafe] Functions that return functions To: "michael rice" <[email protected]> Cc: "Daniel Fischer" <[email protected]>, [email protected] Date: Sunday, April 12, 2009, 11:59 PM On Apr 12, 2009, at 11:50 PM, michael rice wrote: > I'm not sure what you're trying to tell me, so let's try a specific case. > > > Here's the makeVerifier function that expects its function f to have a single > arg, a pair (i,d): > > makeVerifier :: ((Int,Int) -> Int) -> Int -> (Int -> Bool) > makeVerifier f m = divides m . foldl (+) 0 . map f . zip [1 .. ] . digits > > And usage: > let checkCc = makeVerifier (\ (i d) -> if odd i then d else if d < 5 then 2*d > else 2*d + 1) 10 > This looks like it has a typo -- did you mean \ (i, d) -> rather than \ (i d) -> ? > > > And here's the old makeVerifier function that expects its function f to have > two integer arguments, i & d: > > makeVerifier :: (Int -> Int -> Int) -> Int -> (Int -> Bool) > makeVerifier f m = divides m . foldl (+) 0 . zipWith f [1 .. ] . digits > > And usage: > let checkCc = makeVerifier (\ .... <== Complete this ) 10 > let checkCc = makeVerifier (\ i d -> if odd i then d else if d < 5 then 2*d else 2*d + 1) 10 though I find it a bit nicer to expand it a bit for clarity: checkCc :: Int -> Bool checkCc = makeVerifier f 10 where f i d | odd i = d | d < 5 = 2*d | otherwise = 2*d + 1 -Ross > > --- On Sun, 4/12/09, Ross Mellgren <[email protected]> wrote: > > From: Ross Mellgren <[email protected]> > Subject: Re: [Haskell-cafe] Functions that return functions > To: "michael rice" <[email protected]> > Cc: "Daniel Fischer" <[email protected]>, [email protected] > Date: Sunday, April 12, 2009, 9:23 PM > > Under the covers of syntax they only have one parameter, but you can write > curried lambdas or functions easily: > > \ a b -> a + b > > which is equivalent to > > \ a -> \ b -> a + b > > and also equivalent to the "normal" function syntax > > f a b = a + b > > or > > f a = \ b -> a + b > > -Ross > > On Apr 12, 2009, at 9:09 PM, michael rice wrote: > >> My question was meant in the context of the makeVerifier function, which is >> passed a lambda expression. It's my understanding that Haskell lambda >> expressions can have only a single parameter, which is why I changed the >> function parameter to a pair, (i,d). >> >> How would it be done otherwise? >> >> Michael >> >> >> --- On Sun, 4/12/09, Daniel Fischer <[email protected]> wrote: >> >> From: Daniel Fischer <[email protected]> >> Subject: Re: [Haskell-cafe] Functions that return functions >> To: "michael rice" <[email protected]> >> Cc: [email protected] >> Date: Sunday, April 12, 2009, 7:20 PM >> >> Am Montag 13 April 2009 01:09:22 schrieb michael rice: >> > Example please. >> > >> > Michael >> > >> >> Curried: >> >> f :: a -> b -> c >> >> amenable to partial application. >> >> Uncurried: >> >> g :: (a,b) -> c >> >> not easy to apply partially. >> >> The Prelude contains >> >> curry :: ((a,b) -> c) -> (a -> b -> c) >> >> uncurry :: (a -> b -> c) -> ((a,b) -> c) >> >> to convert if needed. >> >> _______________________________________________ >> Haskell-Cafe mailing list >> [email protected] >> http://www.haskell.org/mailman/listinfo/haskell-cafe > >
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
