X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=topics%2Fweek1_advanced_notes.mdwn;h=9bac7eb64fbec8625f85a055d59b1bac6d52067a;hp=1f58f61a9a40e730be92dfaaedbbf6f503ceb5a6;hb=8f3ef33f3f9bc089b5590f660517977b1b3c0972;hpb=defe9acbbc95965b07929c7a5b78e9d00a0526b3 diff --git a/topics/week1_advanced_notes.mdwn b/topics/week1_advanced_notes.mdwn index 1f58f61a..9bac7eb6 100644 --- a/topics/week1_advanced_notes.mdwn +++ b/topics/week1_advanced_notes.mdwn @@ -101,7 +101,7 @@ If we get to the `y & ys` line in the pattern list, and the pattern-match succee Sometimes it's useful to bind variables against overlapping parts of a structure. For instance, suppose I'm writing a pattern that is to be matched against multivalues like `([10, 20], 'true)`. And suppose I want to end up with `ys` bound to `[10, 20]`, `x` bound to `10`, and `xs` bound to `[20]`. Using the techniques introduced so far, I have two options. First, I could bind `ys` against `[10, 20]`, and then initiate a second pattern-match to break that up into `10` and `[20]`. Like this: - case [10, 20] of + case ([10, 20], 'true) of [ys, _] then case ys of x & xs then ...; ... @@ -111,7 +111,7 @@ Sometimes it's useful to bind variables against overlapping parts of a structure Alternatively, I could directly bind `x` against `10` and `xs` against `[20]`. But then I would have to re-cons them together again to get `ys`. Like this: - case [10, 20] of + case ([10, 20], 'true) of [x & xs, _] then let ys match x & xs in ...; @@ -120,7 +120,7 @@ Alternatively, I could directly bind `x` against `10` and `xs` against `[20]`. B Both of these strategies work. But they are a bit inefficient. I said you didn't really need to worry about efficiency in this seminar. But these are also a bit cumbersome to write. There's a special syntax that enables us to bind all three of `ys`, `x`, and `xs` in the desired way, despite the fact that they will be matching against overlapping, rather than discrete, parts of the value `[10, 20]`. The special syntax looks like this: - case [10, 20] of + case ([10, 20], 'true) of [(x & xs) as ys, _] then ... ... end @@ -165,12 +165,14 @@ Function composition, which mathematicians write as `f` ○ `g`, is defined as We've already come across the `id` function, namely λ `x. x`. -Other common functions are `fst`, which takes two arguments and returns the first of them; `snd`, which takes two arguments and returns the second of them; and `swap`, which takes two arguments and returns them both but with their positions swapped. These functions can be defined like this: +Other common functions are `fst`, which takes two arguments and returns the first of them; `snd`, which takes two arguments and returns the second of them; and `swap`, which takes two arguments and returns them both but with their positions swapped. A fourth function is `dup`, which takes one argument and returns it twice. +These functions can be defined like this: let fst (x, y) = x; snd (x, y) = y; - swap (x, y) = (y, x) - in (fst, snd, swap) + swap (x, y) = (y, x); + dup x = (x, x) + in (fst, snd, swap, dup)