Can anyone please comment on the book as a learning material for practical functional programming? All of the comments here are going on tangents (which is ok, but please also comment on the source material).
It hang my PC and I had to use the reset button. The CPU load went 100% and never fallen back (I waited for about 15 minutes). The PC became so extremely slow I couldn't even log-in to another Linux console.
I retried on Windows an it (the download button) worked just fine however.
This is a real question for anyone who might know: Have mathematicians as a whole ever thought about moving from the age-old formulas using various Greek symbols to something more akin to a programming language? What I mean is, instead of writing π to instead use "pi", or "summation()" rather than using the capital sigma? Functions like sin(), cos(), etc. already look like that, I wonder why the derivative sign and others haven't been changed. Superscript and subscript as well, and prime marks. It all seems superfluous.
I guess what I'm asking is there an alternative to traditional mathematical notation that's commonly used?
None that are widely used. What you're suggesting has no advantage over the existing approach and would significantly reduce the speed at which practitioners can read and write mathematical expressions. This is somewhat evident in your example of sin() and cos(). Even in situations like the trig functions where concepts aren't represented with special sigils (because there are too many of them and it would be silly), they are abbreviated in standard ways.
>What I mean is, instead of writing π to instead use "pi", or "summation()" rather than using the capital sigma?
Mathematicians would like to use one symbol for one entity. Is pi the same as π or just p multiplied by i?
As for summation vs Sigma? It'd take much longer to write, and probably a bigger pain to read. Having double summations is extremely common, and triple summations are fairly common as well. If you're doing mathematical manipulations/derivations with these, you'll have them on each line.
The terse syntax exists for a reason - it's efficient. If you read fairly old math books (e.g. from the Arabs, or even more resent), you'll see that they were very expressive. The use of symbols for algebra was a significant advancement in math.
> Mathematics is such a useful tool that science could make few advances without it. However, math and standard sciences, like biology, physics, and chemistry, are distinct in at least one way: how ideas are tested and accepted based on evidence. Math doesn't rely on testing ideas against evidence from the natural world in the same way that other sciences do. Mathematical ideas are often accepted based on deductive proofs, while ideas in other sciences are generally accepted based on the accumulation of many different observations supporting the idea.
Extremely pedantic. In fact, contradicted by your own reference.
>The answer depends on one's philosophical views on the nature of mathematics — and in this area, philosophers and mathematicians have not reached a consensus
>...
>Now it's up to you. How is math similar to and different from science?
Science is an investigation of the empirical, and as such relies on induction, whereas math is deductive and non-empirical. Even if Platonism is true, we don't gain knowledge of math via the senses (mathematical truths are not out there in the world but rather some non-material realm).
> Science (from the Latin word scientia, meaning "knowledge") is a systematic enterprise that builds and organizes knowledge in the form of testable explanations and predictions about the universe.
> Mathematics (from Greek μάθημα máthēma, "knowledge, study, learning") includes the study of such topics as quantity (number theory), structure (algebra), space (geometry), and change (mathematical analysis). It has no generally accepted definition.
One of those words is a bit more defined than the other. I’m not sure how the above qualifies as science.
I assume it means "science" in the older sense of systematized knowledge, like in "the art and science of painting" or Gries's "The Science of Programming". Not in the sense of the scientific method.
This is why I don't use the word "science" when discussing "science" subjects. When I see the word "science" being bandied about, I take it that the person is NOT understanding what they are trying to discuss or do NOT have any ability to discuss the subject in a clear and precise manner.
The word carries too much baggage and for many discussions there are better, more precisely defined terminology to use.
> The word carries too much baggage and for many discussions there are better, more precisely defined terminology to use.
Such as?
This seems to me more like a simple issue of the meaning of a term being dependent on the context. "Science" is not a term with a single, rigorous definition.
> When I see the word "science" being bandied about, I take it that the person is NOT understanding what they are trying to discuss or do NOT have any ability to discuss the subject in a clear and precise manner.
This is a weakness on your part. Unless your idea of science is at least somewhat compatible with, say, what Feyerabend described in Against Method, you may have a romantic and unsubstantiated view of science, which could be dismissed just as easily as your dismissal of those that bandy about the word "science."
You sum it up well with ["Science" is not a term with a single, rigorous definition.] At one point in time, a friend asked me to write up a consistent definition of "science" that he could use for a course he was giving. As I was doing research for this article, I could not find any generally agreed upon definitive definition for what "science" was. It had such a diverse range of meanings. At best, all I could do was define various fields in which there was research going in a systematic, logical and well planned manner. Not at all, what I expected when I started. This is one of the reasons why I don't use the word nowadays. Like I said, from my perspective, the word carries way too much baggage and only causes problems when discussing different subjects.
You then go on to say [This is a weakness on your part. Unless your idea of science is at least somewhat compatible with, say, what Feyerabend described in Against Method, you may have a romantic and unsubstantiated view of science, which could be dismissed just as easily as your dismissal of those that bandy about the word "science."]
My problem with this statement is that amongst various groups who are classified as professional scientists, there is much debate over what "science" is or isn't. An example of this debate is the long running differences that have occurred over whether or not "String Theory" in all of its myriad variations can be classified as science or physics.
Please do note that I did say that what I wrote was my opinion and that you may well have a different opinion and perspective. If you don't agree, I don't have a problem with that. You may be having far better success than I when it comes to discussing all sorts of subjects.
At any rate, I'll stop making further comments now as I have to get a fire going to get the house warmed up. We have had the first month of spring pass and it's still far too cold for my wife to endure not having a fire running.
I took it that they meant science in the very general sense. Of course, the right word should have been math or even “art”, but that word today is often just used to mean “fine art” rather than its more general traditional meaning. My guess is that “the art of functional programming” would make the less pedantic types more annoyed.
It choked my Mac too. Apparently there's an embedded PDF viewer or PDF->HTML viewer in the Github page, and clearly it is not designed for a 450+ page PDF file.
i haven't read this book but in undergrad I skimmed his linear algebra and it was great. it's still the clearest introduction to wedge and exterior products I've ever seen.
It requires a certain amount of mathematical experience and is not suitable for people who are unfamiliar with school-level algebra, or unwilling to learn difficult concepts through prolonged mental concentration and effort.
Why do materials on functional programming always have to be at least somewhat condescending towards the reader?
Or maybe: why such sentences seems to appear only in them?
To understand how and why a C compiler works you don't need all that much algebra. If you thoroughly understand assembly, you're basically good to go.
To understand how and why an FP language compiler works you need to grok the lambda calculus (as a bare minimum). I'd call that algebra. To even understand what problems are being solved by closures, I really had to “learn difficult concepts through prolonged mental concentration and effort”. Giving newbies a heads-up that competent use of such a tool requires nontrivial knowledge is only fair.
eh, i dunno. i think anybody with a decent grip on any language can whip up a scheme compiler way faster than a C compiler. [1] is a very readable guide to scheme and its implementation. Will it be the fastest gun in the west? no. Is it a simple workable foundation that, like, anybody who can put together 100 lines of working code, in any language, can build? for sure. Compilation isn't magic.
Lambda calculus won't hurt. Implementing scheme (which imho is pretty darn close to the lambda calculus) really just requires understanding some operational semantics and you're good to go.
I'd argue, if somebody has written their own interpreter and compiler, leveraging the interpreter at compile time first for constant expression evaluation and then something more sophisticated for partial function evaluation is a lot more intuitive. You can kinda climb a hill of difficulty rather than be teleported to the top and wish them luck.
(To be totally fair i keep trying to open the pdf, but the browser tab locks up. So maybe my observations are meaningless)
_edit_
There is no royal road.
but some roads are perhaps longer, but a little easer to travel.
A closure is essentially a function pointer with some additional data about what some of the symbols refer to. It happens that you're able to write the function nested inside another function.
Why do I need to understand how the compiler works, at that level of detail?
I don't see why understanding closures requires so much mental effort. Just using them a few times should give you a practical understanding of how they work. Closures are not a complicated concept - a bunch data your function has access to outside of its own scope.
> Why do I need to understand how the compiler works
How do you propose to master the language if you don't understand the principal tool that embodies that language? Of course it's always an option to use a language without really understanding it, if that's your thing.
> Closures are not a complicated concept
The first lectures introducing closures after their discovery had CS professors in the audience who didn't understand what they were good for. Functions could access a bunch of data outside their local scope before that.
When I gave this book an attempt, I appreciated the author's honesty about the difficulty of the material. I went with Real World Ocaml instead, intending to reattempt SoFP in the future.
Today I suggested an addition to a section in Real World OCaml, and the author pointed out that the section was already so dense that adding the extra content would require more explanation. I now appreciate the difficulty in making such a technical material approachable by a less technical audience, and a heads up is appropriate.
Edit: (in light of another reply that mentioned the lambda calculus). The addition to Real World OCaml that I suggested was to call out the implementation of the Y combinator in the section on Memoization. The explanation used the Y combinator to work up to an implementation of memoization, and it was so intuitive that I felt it should be noted, but that won't easily fit into an already dense chapter.
This is saying "btw this subject isn't for lazy illiterates", presumably unlike other literature the reader is familiar with. What value does that add exactly?
Yeah, this is completely unnecessary. All programming is algebra as algebra is the math logic and instructions.
I tell people who do analysis and planning for work they are doing calculus all day without realizing it as calculus is the math of continuous change. As a result an analyst who has never programmed before may find the concept of lambda calculus far easier to understand in practice without being a math scholar.
If I write a book about calculus and people say it's too hard, because they don't know what a function is, is it then not more then fair to say to them they should first know some basic math before attempting to understand my book?
That's basically just helping the reader to me and not condescending in any way.
I never even made it to pre-calc and I suck at Algebra but I'm teaching myself CS and functional programming. The title made me interested and the warning tells me I'm probably not ready for it.
haha, i was going to count and report the number of analogies to beauty, nature, painting, etc. but Chrome gave up on me. (come now Chrome, a PDF inside an HTML page making you crawl like a baby turtle!)
glad to find this comment though. it's the other thing that's a little bothersome with the FP community -- at least for me. to be honest, i don't think they realize they are doing any of this. they just seem like the PHD level mathematicians, so to speak, of the programming community!
It would be less condescending if the author just stated what type of math was used and left out the passive aggressive nonsense about people "unwilling to learn difficult concepts through prolonged mental concentration and effort."
And I think that's what the OP is questioning. Most technical writing will spell out what's expected from the reader, but articles about FP also tend to have a "... if you're smart enough" sentiment added in.
Many, I would argue. Just a statement of fact, no judgement.
When I took advanced physics classes in 3rd year of undergrad, I was surprised to note that many of my very smart friends who were computer science majors had lost touch with high-school and introductory college math (particularly calculus) because of an immersion in different kinds of stuff for 2-3 years. Similarly, I've sat in on machine learning classes where CS grad students have little knowledge of probabilistic reasoning or linear algebra (both of which I would consider high-school math, or early college level).
It's not surprising that someone who's not written code for a decade will have a tough time jumping in to start programming right away. So, what's so special about math? It just so happens that some texts on functional programming use a different starting point to approach programming, with different pre-requisites. I wouldn't be surprised if people lose touch with these things after a decade of not using/needing them.
Most people I know are unfamiliar with school-level math. They had it one or two decades ago and forget most of it. It's not a skill that is used day-to-day.
There are tons of people that write code that aren't college graduates and aren't very educated in math.
I'm a high school drop out. I'm teaching myself functional programming and I'm slowly relearning HS algebra so I can move on to subjects I've never taken like precalculus, calculus, and undergrad math.
>How many people "unfamiliar with school-level math" do you know?
How many programmers can solve a quadratic equation without knowing the quadratic formula (i.e. how many can do the algebraic manipulations needed to solve it)?
Functional programming is programming from a mathematical perspective — that's the essence of all of FP. Giving the unfamiliar a warning that "hey, this material is very math-y, and if you don't like math then this isn't for you" is a reasonable disclaimer.
>Why do materials on functional programming always have to be at least somewhat condescending towards the reader? Or maybe: why such sentences seems to appear only in them?
Because who else will get to put in such a sentence? A PHP tutorial, or some Javascript one? On what intellectual grounds would they even be able to justify it?
Besides, the accusation is not even true. You can find many C tutorials that are equally "somewhat condescending towards the reader" -- eg. for not understanding pointers, not knowing how the metal works, etc...
https://github.com/winitzki/sofp/raw/master/sofp-src/sofp.pd...