447 karma · joined November 20, 2011
[ my public key: https://keybase.io/chas; my proof: https://keybase.io/chas/sigs/3e4ZitlD0tm8a9ZVzI7rkK5G03snHd2qvx2ABwqOtHI ]
http://arxiv.org/abs/1002.4482
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.220...
Maximum finds the largest component of a list and compares on the first element of a pair first, so the pair with the longest sequence length as its first element and the starting value that produced that sequence length as it's second element will be returned by `maximum $ map (\a0 -> (collatzLen a0, a0)) [1..max_a0]`.
This function could also be expressed as `collatzLen >>= (,)`, if you were into that sort of thing.
It becomes much more powerful when given the ability to read and write from arbitrary storage, they same way theoretical DFAs become turing machines when given the same power.
I am glossing over the complications that on-chip caches and memory hierarchy introduce, but I feel the core idea of a processor chip as a DFA is still worthwhile.
[1]http://www-inst.eecs.berkeley.edu/~cs150/fa05/CLD_Supplement...
[1]http://en.wikipedia.org/wiki/Zipper_(data_structure)#Example...
This is a relatively old presentation of theirs, but it has a decent overview of what they have used Haskell for. http://www.cse.chalmers.se/edu/year/2010/course/TDA555/Mater...
One approach that I find much more promising is using Haskell (or other robust and semantically easy to reason about and easy to verify languages) to generate C code which then can be used with normal toolchains for low-level development. Galois is doing a lot of work in this area that looks very promising. One of their projects is an autopilot system called SMACCMPilot[0] that uses a Haskell eDSL called Ivory[1] to generate safe C code. I am particularly excited about its integration with FreeRTOS tasks using the Tower Language[2] (another Haskell eDSL).
This makes it possible to generate code that can be reasoned about with Haskell but has the runtime characteristics of C. This is particularly interesting because embedded systems code is notoriously non-composable and difficult to reason about due to the enormous shared state of the hardware itself and the highly concurrent nature of interrupt-driven design. Embedded C makes a good target for this sort of design and analysis though, because it has very constrained memory usage (developers typically eschew dynamic allocation), very subtle potential issues (debugging race conditions with LEDs sucks), and very serious consequences for errors[3].
[0]http://smaccmpilot.org/index.html
[1]http://smaccmpilot.org/languages/ivory-introduction.html
[0]http://www.joelonsoftware.com/articles/fog0000000043.html
This doesn't mean that the people working in non-web industries "are not playing in the same league" with respect to skill, it just means that they don't have a huge public representation of the work they do.
[1]http://docs.python.org/2/library/sys.html#sys.setrecursionli...
To see why this is useful, imagine a song you wanted to listen to that was recorded with a low-pitch hum in the background because the microphone running next to a power cable and picked up the 60 Hz signal. Removing this unwanted tone by looking at the value of the song in time is really hard because the 60 Hz signal is mixed up with the rest of the song. However, when transformed into the frequency domain, the 60 Hz hum is very easy to spot and remove. When you transform the signal back into the time-domain (so you can listen to it), the 60 Hz will still be gone.
This process can be done automatically with computers using a technique called the Fast Fourier Transform. This is the basis of many techniques in the field of Digital Signal Processing (DSP) which is the theory behind most of the communication breakthroughs of the last 40 years. I should note that many naive approaches to this problem (like the approach in my example) don't work particularly well, so as in any problem domain, there are important but subtle performance trade-offs to consider.
Further discussion on LtU: http://lambda-the-ultimate.org/node/2131
[1] https://code.google.com/p/virgil/ [2] http://compilers.cs.ucla.edu/virgil/overview.html
[1] http://apr.apache.org/ [2] https://developer.gnome.org/glib/2.34/ [3] http://sglib.sourceforge.net/
Programming is very focused on symbolic reasoning right now, so it makes sense for him to focus on visual and interactive representations and interactive models often are intertwined with visual representation. His focus on a balanced approach to programming seems like a constant harping on visualization because of this. I think he is trying to get the feedback loop between creator and creation as tight as possible and using all available means to represent that system.
The prototypes I have seen of his that are direct programming tend not to look like LabView, instead they are augmented IDEs that have visual representations of processing that are linked to the symbolic representations that were used to create them. [4] This way you can manipulate the output and see how the system changes, see how the linkages in the system relate, and change the symbols to get different output. it is a tool for making systems represented by symbols but interacting with the system can come through a visual or symbolic representation.
[1] http://worrydream.com/MediaForThinkingTheUnthinkable/note.ht...
[2] http://vimeo.com/67076984#t=12m51s
[1] http://www.amazon.com/Kernel-Development-Developers-Library-...