Hacker News new | past | comments | ask | show | jobs | submit login
A Functional Introduction To Computer Science (uwaterloo.ca)
188 points by debanjan16 on July 2, 2023 | hide | past | favorite | 34 comments



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


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.


When I was a child, last century, our middle-school "computers" class started off with bitwise operations. Have booleans dropped out of the rudimentary curriculum since then?


Yes. I had to learn bitwise operations independently when debugging some code written in a vendor-specific scripting language derived from C++


Not entirely. My CS undergrad featured a discrete math course that was almost exclusively boolean logic and proofs. The prerequisites of the course plan put it very early in a given CS students' schooling. I took it alongside our second CS intro course, where we taught C++ (with Python being in the first intro course).


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.


> It makes sense that it's a mathematical approach because Computer Science is ultimately a Mathematical discipline

The fact that the abstraction "logical circuits" is much closer to actual computers than any "mathematical" or "functional" abstraction casts doubt on this claim.


"Computer Science" comes in two flavours, systems and theory. Each of you is talking about a different flavour.

(most CS departments cater to a single flavour: yes, it would be easier for everyone involved if theoretical computer science was called "informatics", but that'd probably be funding-sub-optimal)


But the logical abstraction is no less theoretical than other abstractions, even if it closer to practice. I don't understand why theoretical computer scientists ignore it.


> The fact that the abstraction "logical circuits" is much closer to actual computers than any "mathematical" or "functional" abstraction casts doubt on this claim.

But 'logical circuits' are abstracted using symbolic logic and boolean algebra which are mathematical disciplines. It's still math.

Also, computer science doesn't necessarily mean computers as we know it today. A 'computer' in computer science is something that can process 'computable numbers'. For example, in Turing's paper, he imagine a person ( computer ) 'doing math' with a pen and paper.


> But 'logical circuits' are abstracted using symbolic logic and boolean algebra which are mathematical disciplines. It's still math.

Whether logic itself counts as math or something separate from it is contentious. If you do count logic as math, assume I was talking about the rest of mathematics excluding logic.

> Also, computer science doesn't necessarily mean computers as we know it today. A 'computer' in computer science is something that can process 'computable numbers'. For example, in Turing's paper, he imagine a person ( computer ) 'doing math' with a pen and paper.

Yeah, but persons are the opposite of simple and primitive.


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


That sounds pretty cool! Link:

https://www.nand2tetris.org/

Though I'm not sure whether they relate this approach to the traditional FSM/PDA/TM models of computing. There seems to be a disconnect between theoretical computer science (which uses the classical models) and more "practical" computer science which uses Boolean and sequential logic circuits as a model of computing .


From what I remember: it does not. It's about building a practical computer.


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.


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.


If you have time, I'd love your feedback on http://www.creativescala.org/creative-scala/

It's still very much WIP, but this chapter is complete and should be approachable if you know the basics of Scala: http://www.creativescala.org/creative-scala/cycles/


Don't miss Part II [0], which (not to discount the quality of Part I) is much less elementary and much more interesting.

[0] https://cs.uwaterloo.ca/~plragde/flane/FICS2/


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.


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.


Hi Noel!

Yeah, Racket is faster than Python normally.


Hi Jens! :)


I can't believe I have never heard of Racket before, it's 28 years old!

Quite some libraries available too https://github.com/avelino/awesome-racket


Mentioned many times in the past 8 years on HN.

https://hn.algolia.com/?dateEnd=1688294284&dateRange=custom&...


Maybe you did while it was still called PLT Scheme (supported in DrScheme), although it's called Racket since 13 years.


See also "Teach yourself Computer Science functionally"

https://news.ycombinator.com/item?id=36312603 (315 points | 18 days ago | 99 comments)


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


How to Design Programs is also an intro to programming using Racket as the teaching language https://htdp.org/2023-5-12/Book/index.html


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


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.


Can this be considered a modern version of SICP?

https://en.wikipedia.org/wiki/Structure_and_Interpretation_o...



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


this seems like a great resource, thanks for posting.




Consider applying for YC's W25 batch! Applications are open till Nov 12.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: