Send Beginners mailing list submissions to beginners@haskell.org To subscribe or unsubscribe via the World Wide Web, visit http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners or, via email, send a message with subject or body 'help' to beginners-requ...@haskell.org
You can reach the person managing the list at beginners-ow...@haskell.org When replying, please edit your Subject line so it is more specific than "Re: Contents of Beginners digest..." Today's Topics: 1. Confusion over currying, , lambda, and closures (Lawrence Bottorff) 2. Re: Confusion over currying, , lambda, and closures (Bob Ippolito) 3. Re: Confusion over currying, , lambda, and closures (Francesco Ariis) 4. mconcat (PICCA Frederic-Emmanuel) 5. Re: Confusion over currying, , lambda, and closures (Jay Sulzberger) ---------------------------------------------------------------------- Message: 1 Date: Wed, 23 Dec 2020 21:12:08 -0600 From: Lawrence Bottorff <borg...@gmail.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: [Haskell-beginners] Confusion over currying, , lambda, and closures Message-ID: <cafahfsvu5l21g8gavjjsezxzdtgfrjocogy7ws39uheh+kh...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" I have these three versions of addition addA x y = x + y addB x = \y -> x + y addC = \x -> \y -> x + y and all three add two arguments just fine > addA 2 3 5 > addB 2 3 5 > addC 2 3 5 but I can't see how addB and addC are actually accomplishing this. addA is currying, which I don't fully follow. addC I understand beta reduction-wise (\x -> \y -> x + y) 2 3 (\y -> 2 + y) 3 (2 + 3) 5 but I don't understand addB and what steps are happening currying/beta reduction-wise. Can someone break down the steps with addA and addB? LB -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20201223/c75630f1/attachment-0001.html> ------------------------------ Message: 2 Date: Wed, 23 Dec 2020 20:02:17 -0800 From: Bob Ippolito <b...@redivi.com> To: The Haskell-Beginners Mailing List - Discussion of primarily beginner-level topics related to Haskell <beginners@haskell.org> Subject: Re: [Haskell-beginners] Confusion over currying, , lambda, and closures Message-ID: <cacwmpm8g+wptieyrrazt7sotbz3cko0q+yxmqmro8hnqwsk...@mail.gmail.com> Content-Type: text/plain; charset="utf-8" The steps and semantics are the same, the only meaningful difference is syntax. These two definitions are indistinguishable: f x = y f = \x -> y In basically the same way that these two expressions are: (+) 1 2 1 + 2 In Haskell there are many cases where a more convenient but equivalent syntax exists to express certain terms. This is referred to as syntax sugar. On Wed, Dec 23, 2020 at 19:12 Lawrence Bottorff <borg...@gmail.com> wrote: > I have these three versions of addition > > addA x y = x + y > addB x = \y -> x + y > addC = \x -> \y -> x + y > > and all three add two arguments just fine > > > addA 2 3 > 5 > > addB 2 3 > 5 > > addC 2 3 > 5 > > but I can't see how addB and addC are actually accomplishing this. addA is > currying, which I don't fully follow. addC I understand beta reduction-wise > > (\x -> \y -> x + y) 2 3 > (\y -> 2 + y) 3 > (2 + 3) > 5 > > but I don't understand addB and what steps are happening currying/beta > reduction-wise. Can someone break down the steps with addA and addB? > > LB > > > _______________________________________________ > Beginners mailing list > Beginners@haskell.org > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://mail.haskell.org/pipermail/beginners/attachments/20201223/8b290540/attachment-0001.html> ------------------------------ Message: 3 Date: Thu, 24 Dec 2020 05:37:22 +0100 From: Francesco Ariis <fa...@ariis.it> To: beginners@haskell.org Subject: Re: [Haskell-beginners] Confusion over currying, , lambda, and closures Message-ID: <20201224043722.GB911@extensa> Content-Type: text/plain; charset=utf-8 Il 23 dicembre 2020 alle 21:12 Lawrence Bottorff ha scritto: > I have these three versions of addition > > addA x y = x + y > addB x = \y -> x + y > addC = \x -> \y -> x + y > > […] > > I can't see how addB and addC are actually accomplishing this. addA is > currying, which I don't fully follow. Parameters on the left-hand side of a function definition can always be expressed as a lambda, by «plucking» them from the rightmost one addA x y = x + y addA x = \y -> x + y addA = \x -> \y -> x + y -- those three are equal! Intuitively you can say that first we are binding the patterns in the function definition and then the one left in the lambda right-hand side (if any). So: add 3 5 addA x = \y -> x + y 3 5 \y -> 3 + y 5 3 + 5 I suspect what the book is trying to teach you is that you can partially apply a function and pass it around merrily: map (addA 3) [1, 2, 3] So by writing `addA 3` we obtain: addA :: Int -> Int -> Int addA :: Int -> (Int -> Int) -- can also be written like this -- since `(->)` is associates to -- the right add3 :: Int -> Int -- applying addA to 3 another function with one parameter less. Once everything is applied, you will get your result! ------------------------------ Message: 4 Date: Thu, 24 Dec 2020 06:48:51 +0000 From: PICCA Frederic-Emmanuel <frederic-emmanuel.pi...@synchrotron-soleil.fr> To: "beginners@haskell.org" <beginners@haskell.org> Subject: [Haskell-beginners] mconcat Message-ID: <a2a20ec3b8560d408356cac2fc148e5301bf027...@sun-dag3.synchrotron-soleil.fr> Content-Type: text/plain; charset="us-ascii" Hello, I have a monoid and I would like to know if there is a way to do the concatenation in parallele ? the mappend method takes time for my type. thanks for you help. Frederic ------------------------------ Message: 5 Date: Thu, 24 Dec 2020 07:15:25 +0000 () From: Jay Sulzberger <j...@panix.com> To: The Haskell-Beginners Mailing List <beginners@haskell.org> Subject: Re: [Haskell-beginners] Confusion over currying, , lambda, and closures Message-ID: <pine.neb.4.64.2012240642420.4...@panix3.panix.com> Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed On Wed, 23 Dec 2020, Lawrence Bottorff <borg...@gmail.com> wrote: > I have these three versions of addition > > addA x y = x + y > addB x = \y -> x + y > addC = \x -> \y -> x + y > > and all three add two arguments just fine > >> addA 2 3 > 5 >> addB 2 3 > 5 >> addC 2 3 > 5 > > but I can't see how addB and addC are actually accomplishing this. addA is > currying, which I don't fully follow. addC I understand beta reduction-wise > > (\x -> \y -> x + y) 2 3 > (\y -> 2 + y) 3 > (2 + 3) > 5 > > but I don't understand addB and what steps are happening currying/beta > reduction-wise. Can someone break down the steps with addA and addB? > > LB Dear Lawrence Bottorf, your questions are delightful! Heaven forwarding, I will respond more fully and clearly. The questions you ask strike at the heart of the issue: Why is Haskell so hard to learn? I offer no decent answer here, but I give below a transcript of an incoherent session with ghci on panix3.panix.com, panix3% ghci --version The Glorious Glasgow Haskell Compilation System, version 7.8.4 panix3% uname -a NetBSD panix3.panix.com 9.0 NetBSD 9.0 (PANIX-XEN-USER) #1: Sun May 3 21:15:18 EDT 2020 r...@juggler.panix.com:/misc/obj64/misc/devel/netbsd/9.0/src/sys/arch/amd64/compile/PANIX-XEN-USER amd64 panix3% Below is the whole transcript of the session. Note two things: 1. I do not know ghci. 2. I failed to ask the ':t" questions in the right order, for a good training video. But I hope the transcript is helpful. oo--JS. bash-5.0$ ghci GHCi, version 7.8.4: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer-gmp ... linking ... done. Loading package base ... linking ... done. Prelude> let addA x y = x + y Prelude> addA <interactive>:6:1: No instance for (Show (a0 -> a0 -> a0)) arising from a use of `print' In a stmt of an interactive GHCi command: print it Prelude> print addA <interactive>:7:1: No instance for (Show (a0 -> a0 -> a0)) arising from a use of `print' In the expression: print addA In an equation for `it': it = print addA <interactive>:7:7: No instance for (Num a0) arising from a use of `addA' The type variable `a0' is ambiguous Note: there are several potential instances: instance Num Double -- Defined in `GHC.Float' instance Num Float -- Defined in `GHC.Float' instance Integral a => Num (GHC.Real.Ratio a) -- Defined in `GHC.Real' ...plus three others In the first argument of `print', namely `addA' In the expression: print addA In an equation for `it': it = print addA Prelude> let addA x y = x + y Prelude> print it <interactive>:9:7: Not in scope: `it' Perhaps you meant `id' (imported from Prelude) Prelude> addA <interactive>:10:1: No instance for (Show (a0 -> a0 -> a0)) arising from a use of `print' In a stmt of an interactive GHCi command: print it Prelude> addA 7 <interactive>:11:1: No instance for (Show (a0 -> a0)) arising from a use of `print' In a stmt of an interactive GHCi command: print it Prelude> addA 7 5 12 Prelude> (addA 7) <interactive>:13:1: No instance for (Show (a0 -> a0)) arising from a use of `print' In a stmt of an interactive GHCi command: print it Prelude> :t (addA 7) (addA 7) :: Num a => a -> a Prelude> :t addA addA :: Num a => a -> a -> a Prelude> :t addA 7 addA 7 :: Num a => a -> a Prelude> :t addA 7 5 addA 7 5 :: Num a => a Prelude> let addB x = \y -> x + y Prelude> :t addB addB :: Num a => a -> a -> a Prelude> :t addB 7 addB 7 :: Num a => a -> a Prelude> :t (addB 7) (addB 7) :: Num a => a -> a Prelude> :t addB 7 5 addB 7 5 :: Num a => a Prelude> let addC = \x -> \y -> x + y Prelude> :t addC addC :: Num a => a -> a -> a Prelude> :t (addC) (addC) :: Num a => a -> a -> a Prelude> :t addC 7 addC 7 :: Num a => a -> a Prelude> :t (addC 7) (addC 7) :: Num a => a -> a Prelude> :t addC 7 5 addC 7 5 :: Num a => a Prelude> addC 7 5 12 Prelude> (addC 7 5) 12 Prelude> (exit) <interactive>:31:2: Not in scope: `exit' Prelude> Leaving GHCi. bash-5.0$ ------------------------------ Subject: Digest Footer _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners ------------------------------ End of Beginners Digest, Vol 149, Issue 18 ******************************************