top | item 36558759

A Functional Introduction To Computer Science

188 points| debanjan16 | 2 years ago |cs.uwaterloo.ca

34 comments

order

cubefox|2 years ago

This is a very mathematically inspired introduction, as they say in the initial chapter.

What I would like to see is a logical introduction to computer science, or at least theoretical computer science.

Start with combinational logic [1], i.e. with Boolean circuits. They are both conceptually simple and relatively close to physical transistors, unlike any functional / mathematical approach. Then move on to sequential logic[2] which allows the introduction of memory/states, e.g. via flip-flops. From this, more complex circuits and even a primitive GOTO language would be introduced. What I would be interested in is how these circuits relate to the traditional models of computation, i.e. finite state machines, pushdown automatons and Turing machines. Not very cleanly, I suspect.

[1] https://en.wikipedia.org/wiki/Combinational_logic

[2] https://en.wikipedia.org/wiki/Sequential_logic

c_crank|2 years ago

Side note to this: I noticed that a smart friend had trouble learning anything outside of trivial programming due to unfamiliarity with boolean algebra and boolean logic. She only seemed to begin to understand the concepts when relating them to patterns used in knitting. If those were more commonly taught in basic math, it might make programming generally more approachable.

tialaramex|2 years ago

It makes sense that it's a mathematical approach because Computer Science is ultimately a Mathematical discipline, the Church-Turing intuition aligns these machines to mathematics (and I would argue us too, but that's controversial).

Lots of elite CS courses start there, Cambridge did even when I was applying thirty years ago, Oxford does these days (back then it didn't acknowledge CS as a "real" subject, you were basically a mathematician and you'd just be studying this oddly practical sub-discipline of mathematics). Both teach an ML today. The place I studied began with an ML then too (today it begins with Java, which is I think inferior but they get $$$ so...)

My unconsidered guess is that your "begin with booleans" thing just gets to arithmetic via a long winding route, and either as it approaches arithmetic, or just before, it accidentally gets infected with Gödel incompleteness so you are no better off, with the same problems but maybe a greater appreciation of why they were unavoidable, except maybe you're very tired.

vehicles2b|2 years ago

I agree with you, which is why I’ve found nand2tetris to be a joy to read and work through.

noelwelsh|2 years ago

Different roads that reach the same place, I think.

Finite state machines are a small step away from sequential logic and help with managing complexity. Pushdown automata are a small step from finite state machines. I think of Turing machines as an architecture for a computer consisting of a separate CPU and memory, which happens to correspond to the most common architecture used today, but not a particularly useful tool for managing complexity as they have no structure. Functions are useful for managing complexity, and function call / return requires some notion of a stack. Once you're there you can build up the rest of FP. Pure function correspond to combinatorial. Those with state correspond to sequential logic. etc.

Going in the reverse direction, compilation connects functional programming to hardware.

swader999|2 years ago

I think it's the math notation and math problem domain that seems to leak into attempts to broaden the audience. Tersely named, far removed from anything I could reach out and touch.

I could never grok scala, all the examples and learning material used math idioms, metaphors and symbology. So I was always translating and it was very difficult to pick up.

And yes, I fully realize this was my own shortcoming. I should have put eight years into the foundational knowledge. But I wonder if these math metaphors translate to a more broadly shared experience. They should be in theory. Programming is supposed to be a tool to accomplish goals, it shouldn't force users into it's inner world as much as it does. It feels like I need a formula one crew just to drive a car from Seattle to Kansas.

tralarpa|2 years ago

Oh, they are using Racket. I really love that language. I think it's also great that they explain how to work with structures, instead of going the "everything is a list" aproach (the latter is, in my opinion, better suited for advanced students).

Unfortunately, I haven't managed yet to integrate Racket into my daily work. The last time I tried to use it, the resulting (manually optimized) compiled code was as slow as an unoptimized python solution and 10x slower than a manually optimized Java version.

noelwelsh|2 years ago

I'm really surprised to hear Racket code was slower than Python. Racket has had a JIT compiler for a very long time, and v8 has a much better JIT compiler, so I would expect its performance to be vastly better than Python.

genericuser256|2 years ago

This was a really fantastic course, good intro to the principles of recursion and fundamentals of CS

s-zeng|2 years ago

Ragde is an excellent CS prof. I really enjoyed the functional approach Waterloo takes in first year CS, especially in the optional more advanced version of the course where they go a lot deeper into the math connections and interpreters

grousewood|2 years ago

Had him 25 years ago for Digital Logic. His enthusiasm was far beyond most of the other profs. Warms my cockles to see he’s still keeping it real.

josefrichter|2 years ago

Oh God, wish I had this when I first started.

yungporko|2 years ago

this seems like a great resource, thanks for posting.

lincpa|2 years ago

[deleted]