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

Reply via email to