arrows pointing right and left

Scott Turner's blog archive

email Scott Turner

home schooling
diversions & distractions
blog archive

In 2008, much of the U.S.A and the world experienced great hardship caused by the financial industry. Knowledgeable people pointed out that the trillion dollars it was costing the American people was just a band aid, and that new regulations would be required to prevent it happening again. At last U.S. Congress is preparing to answer the need by passing new regulations for banks. Time for a sigh of relief? Mike Konczal’s commentary will make you think again.


The U.S. government is about to take a big step in the wrong direction. I’m caught up in what’s going on, and feel compelled to express my thoughts. Maybe they’ll do some good if you call your congressman today.

I’ve known for some time that mortgage lending had gotten out of hand. In 2007 my daughter and her husband were considering whether they could afford to own a small home. I checked out the mortgage terms that were outlined for them, and was glad to see that they were looking at a straight, fixed-rate mortgage, rather than an adjustable-rate or worse, and I cautioned that you really do want to have a substantial down payment.

A few months ago, it was still something of a shock to me to hear how Countrywide Financial, shortly before it collapsed, was making profits by arranging fraudlulent, doomed mortgages.

Now the effects of those mortgages and similar weakly-backed securities have propagated from mortgage lenders to investment bankers and other banks. No one knows who to trust with their money, and it’s beginning to affect the ability of some businesses to get the short-term loans they depend on. It is the job of the Federal Reserve to keep lending going and avoid a panic, so it’s to be expected that Chairman Bernanke would deal with the problem.

Consider what went wrong. Risky loans were advanced, and were put on the books of lenders with a certain value, and when some home values went down, some of those loans became worthless. There was some fraud, some speculation, and some fancy financial contract-making going on, all leading to a situation in which investors did not and could not know how risky their investments were. Whether those investments were in mortgage-backed securities or in banks, they were at risk and couldn’t find out.

So you’ve got two problems.
  1. Opaque, risky securities.
  2. Credit so tight as to raise doubts about the economy.

It’s not surprising that Chairman Bernanke would come to Congress with a proposal. But what a proposal. The essence of the program is for the U.S. to borrow money and spend it on buying the bad debt. It doesn’t directly address either of the problems!

That’s why I sent messages and blogged a week ago against the bill, knowing full well that it would be prettied up with good things to make it more palatable. Even if it addresses sustainable energy technology, deposit insurance, etc., the U.S. cannot afford a $700 billion mistake.

Yesterday the PBS News Hour hosted three economists, two in favor of the bill and one against. The economist most in favor said that the bill was necessary to calm the panic. The next one agreed, while saying that the only really good part of the bill was the boosting of the FDIC bank deposit insurance. The third economist said that the bill isn’t going to address the actual need.

The bill will calm the panic for a while, until the realization sinks in that little has been accomplished, and that the U.S. is asking for more loans from foreign banks while having done nothing towards becoming more credit-worthy. It looks as if our dollars will be safe in the banks, but they will be worth considerably less.

I’m disappointed in both Obama and McCain. They claim to be bringing change to Washington, but both have climbed on the bandwagon supporting this bill. At least Obama has said there will be more to be done beyond passing the bill, before the financial system is straightened out. But that admission is not enough. Spending $700 billion to temporarily sidestep the real problems is a bad thing right now.


We urge you to oppose the legislation that currently has the attention of the Senate, Congress, and the press.

We read Chairman Bernanke's testimony yesterday, and are nearly persuaded by it. However, it is troubling that the core of the plan is to buy up the securities which are rightly called "toxic". Experts say that there's no guarantee that the purchased securities will turn out to be have an actual value near their purchase price. These "assets" should not have been created in the first place. What they need is transparency, and massive scrutiny. The planned legislation will put the needed scrutiny on hold.

Corporations are unable to sell these securities because the way the law works now, their bottom line is impacted when the sale occurs. Regulations should be changed so that corporations are required to take the hit immediately. That would lead to much needed transparency for those businesses, and would make the market for these securities more liquid.

Much in the news are the efforts of Democrats and others to modify the bill so that it will benefit homeowners more directly, will prevent financial executives from profiting excessively, etc. These are excellent changes, however, the "lipstick on a pig" is phrase is spot on in this case. They don't fix the essential problem with the bill, that it puts the U.S. in a position of supporting bad securities, and does so at a massive, almost incomprehensible scale.

Not enough attention has been paid to how this bill is paid for. The options are taxes, borrowing, or "printing money". You know very well that taxes are out of the question at this point. The alternatives of borrowing or "printing money" are extremely risky for the U.S. economy, because they can easily lead to panic dumping of U.S. dollars.

What are the terrible consequences if the mortgage bailout is not passed? People won't be able to get a car loan or credit, causing failure in the auto industry and depression in the economy as a whole? Yes, that possibility must be addressed, so do it head on! A federal program could back new loans that are made under sufficient scrutiny that the private sector will be eager to invest in them.

Secretary Paulson said that the outlook apart from this legislation is "grim". With it, we view the outlook as even grimmer. We look to you for a completely different approach.

My wife and I sent the above to our senators and congressman yesterday morning. Since then President Bush has addressed the country, and has adapted the legislation in a number of ways to address the concerns of legisators. The changes are all for the better, yet there is much in the process which needs criticism, and I continue to regard the bill as a mistake which should be cast aside and restarted.

President Bush is again getting his way by bringing his defective solution to a supposedly urgent problem before congress, and I can only watch as congress again imitates a “deer in the headlights”.

I reread the gospel of Luke chapter 16 verses 1-8, a parable which matches the current situation in striking fashion. Unfortunately, the point of the parable is spritual rather than economic, so its relevance is secondary. But I'll be you get a kick out of it.


Harmonographs create intriguing patterns of curves from the motion of pendulums. I always knew a little about them, from when my mathematician mother pointed out “Lissajous figures”. The name harmonograph recognizes that both these figures and musical harmony are closely tied to ratios.

curve for the ratio sqrt(36/33)

This rested in the background until musical Steve expressed an interest in researching the relationships among the ratios, the graphs, the harmonies and the music. He needed some accurate harmonograph curves, and I thought it would be a fun subject for developing a computer program. So I put together a program that traces the path of the harmonograph. It was cool, but not what Steve needed.

Since then the major changes have been

  • Record the path of the harmonograph permanently.
  • Change the decay of the pendulums from viscous to friction.
  • Make the user interface document-centric, saving configurations and graphs.
  • Enable printing and exporting bitmaps.

And now it's released as harmonograph 1.0!

curve for the ration 3:1


The Ambidexter web pages will in the future use category theory more correctly, at least in one respect. It was a little fun, and a little embarrassing to discover that Ambidexter’s IO type constructors are not monads, since this web site has been calling them monads for months. They play a similar role to the IO monad in the Haskell programming language, and like Haskell’s IO they are functors. But they are contravariant rather than covariant. The best name I have for them is continuation functors.

I ran into this information while developing a revised type system in which the two most important type constructors are the pure evaluation and the IO continuation functors. The pure evaluation functor is negation, when you take the logical point of view, so it is represented by the logician's symbol ¬,


I've started work with Raytheon, so don't expect much improvement or change to Ambidexter at least until November, because painting the house and orienteering will be filling my spare time.

Kevin has arrived in Japan for the first semester of his senior year of college. His visit begins with a two week tour. I am envious that while on tour he will be hiking up four mountains.


The relationship between I/O and logic in programming languages is a bigger subject than I knew. When Ambidexter was first released it had an open issue in that area, and each of the 4 revisions has been an attempt at progress. The latest, 0.5, takes an unexpected tack, introducing a run-time error.

Here's an example.

    (ret <+
       {"main" put;
	((c <+ "alt" put $ret):String) put

ret is a goal, or output variable, for the entire program. The expression in curly braces is provided to satisfy that goal, using two put statements. First the string "main" is put. The next put has an interesting argument of type String. When that expression is evaluated, it refers to the ret goal again, causing a jump in control. It tries to satisfy the goal with a different action, a put of the string "alt". Since the goal is already in progress, this is an error.

Ambidexter's primitives provide powerful control operations. The interaction between control and I/O has been a concern all along. Calling this a run-time error is unusual in languages that support continuations. It's a consequence of Ambidexter's monadic approach, in which the program's interaction with the environment consists of a sequence of actions. Once an action commences, control must not substitute a different action at the same point in the sequence.

The need for this run-time check is similar to that of Mercury although the feature and implementation lack the sophistication of Mercury's determinism.

I continue to consider Arrows as a possible approach for eliminating the run-time error.

Another change in 0.5 is to the built-in function abort Its earlier implementation violated the sequential principle, substituting an arbitrary action for the program's normal sequence. Now abort generates a runtime error, passing along a diagnostic string.

Finally, the --cbpv option was removed. The restrictions that it enforced were not consistent with Ambidexter's goal of providing a type system reflecting the symmetry of classical logic.


Call-By-Push-Value (CBPV) is an interesting foundation for programming language design. The Ambidexter language that I'm developing needs to provide better control over side effects, so I looked into CBPV for this purpose. The 0.2 revision of Ambidexter has a --call-by-push-value option which makes restrictions to match the basic CBPV constructs. While CBPV provides careful control over side effects, it may not be the end of changes for this aspect of Ambidexter.

The following example is valid in CBPV mode. The expression of type ¬String is evaluated during the _put action, causing control to jump to a completely different action.

    [ret ->
       [[c -> ret$ _put_newline]:¬String] _put
In Haskell, exceptions can break the execution sequence in a related way, but I am not content with a conventional monad as the primary method of managing I/O in Ambidexter. Arrows are a possible alternative.

Release 0.2 is available for download. Besides CBPV, it has a new way of treating function and I/O types, much better type diagnostics, and some bug fixes.


Ambidexter is online.

Most recently I've cleaned up the beginnings of a tutorial and examples, added a license, built executables on Windows and Mac, and put them on the web server. It is regularly said that for a project to be successful, it has to get users involved early, which is something I have reminded myself of often, when the urge comes to make this thing more perfect before exposing it. There are so many ways in which it is incomplete, but it's at a point where some people can see what it's about and try it out and give feedback.

Please let me know how I can make the Ambidexter web pages more useful to you, and the language more interesting to you, because I expect to be responsive.


Over the past few days, I've spread the new design throughout this web site. This affects more than 100 pages, so some effort and programming were involved. The latest enhancement is to the navigation links on the left side of each page. They are now organized so that groups of related pages share sets of links, and at the same time an individual page can have its own special links.

Other than design and layout, don't expect uniformity within this web site. Some of the mathematical and programming language information was developed for my home schooled children at various stages of their education. Some of the cheat sheets are quite elementary.

In my preceding blog entry, I was anticipating a swift release of the programming language Ambidexter. The test failures were down to one. But it turned out that a number of problems with the type checker were hidden because the type checker was stopping too soon. There was an extra week of heavy-duty implementation work.


This has been a good day for my programming language project. To start with, it's at a point where release is predictable. With a moderate effort on this web site, it can be relased in two weeks. I've had to suppress perfectionist urges in this process — the upcoming version will be interesting, but will have a number of known bugs and limitations. It could even be subject to incompatible syntax changes. Such known issues will be documented.

What makes this a particularly good day is that I've answered a question I had about this language. I have speculated for some time that Ambidexter was inherently efficient. Most functional languages have a run-time requirement that goes beyond the basic execution model. Certain function calls, called tail recursive, must not allocate memory when they run. This enables the programmer to write recursive functions that fill the role of iteration (while, for, and do loops) in conventional languages.

I thought that Ambidexter’s thorough support for continuations and coterms would be sufficient to provide iteration with just a basic execution model and no further requirements. Today I was able to demonstrate this.

One reason it was to be expected was that Filinski's thesis describes recursion and iteration as duals of one another, and Ambidexter's core fully reflects the duality that underlies this assertion.

Iteration in Ambidexter can be based on a cut of a particular term with a particular coterm,
([x-> x $ [(x)]]) $ [x-> x $ [(x)]]
which reproduces itself when executed. In the syntax of Wadler's paper, Call-by-Value is Dual to Call-by-Name, the same cut is expressed
[x.(x • not<x>)]not • x.(x • not<x>)


My son Kevin is back from college for Christmas. As he is a Computer Science major, I asked him to take a look at the Ambidexter programming language that I'm developing. I showed him a by-value function (lambda) expression and application. Then to demonstrate the dual nature of the language, I showed him the by-name version of the same thing. Because Ambidexter used a symmetric syntax like that of Filinski's Symmetric Lambda Calculus, the conversion from by-value to by-name involved reflecting nearly everything left and right. Kevin reacted strongly against both the conversion process and the resulting code. I swiftly accepted the criticism, as doubts had been on my mind for a while. In a day the interpreter was revised so that by-name functions have the parameter on the left.

Function application still has the function on the right, à la APL. Associativity of function application supports currying, though I want to revisit that choice.

Here are examples of function and application expressions.
  "Sun" (\x -> x " Day" concat)
old by-name,
  [_concat x " Day" <- x/] "Sun"
revised by-name,
  "Sun" [\x ~> x " Day" _concat]
A rationale for the square brackets and the tilde-arrow will have to wait for another day's blog.


The changes to this web site are just a redecoration for now, making several of the web pages consistent. The logo reflects the Ambidexter programming language that I'm working on. Details of the language are still not ready to present. A few examples would make it easy to see what inspires the name and logo.

Beyond that, December is a big month for the season of Advent at church, so I'll be rehearsing more often with the choir. And in the Turner family we're between Kathy's and Phil's birthdays.


During the past week I've been studying more of the basics of programming language theory, in order to better describe the interpreter I'm developing. Progress was on hold due to a concern that the language lacked confluence, i.e. an unambiguous meaning for each valid program. It turns out that the interpreter is perfectly confluent, due to its asymmetrical evaluation strategy. In addition, the sequential strategy could be replaced with a parallel, nondeterministic mechanism and still be reasonably meaningful.

So the Ambidexter interpreter should make its appearance here before long. In the meantime there's a new page on the Curry-Howard correspondence if you're inclined to view the match between logic and programming.


My Ambidexter experiment implements a programming language that combines strict and non-strict functions without limitations. Its predecessor is Filinski's Symmetric Lambda Calculus. Monadic I/O, universal types and existential types fit into the language nicely, which was encouraging. I knew the language was missing the confluence property, and am just now learning how large an obstacle this is. You don't see a lot written about it, but confluence stands at the divide between by-value and by-name functions which has influenced the programming language landscape from the beginning.

As long as the lack of confluence looms, I won't be promoting this implementation. I'll be looking at linear types. Suggestions for other fruitful ways to restore confluence are welcome.


My web site is beginning a makeover today, based on the familiar blog layout. It's not using blog software of any kind yet, but this will give a feel for it.

My daughter Jocelyn has suggested a good way to reorganize things, and I'm aiming for that. It won't be hard to produce an improvement!

The impetus for this change comes in part so that potential employers (if they check on such things) will find the good stuff more readily. Also I will be giving people a chance to take a look at my computer programming experiment in the form of the Ambidexter language.

Support open standards!  
Valid XHTML 1.0!