On the drive home a while back, I was thinking about the REST model, which is resource-oriented. Everything in the system is a resource. The pointers are all references to resources. The allowed operations are variations on CRUD, and no more. Well, not much more, if you’re doing it right.
So the next obvious thing is to make functions first-class objects, er… resources, as well.
I haven’t thought it all the way through, but I think that offers some interesting possibilities.
- The resources that a client uses GET PUT DELETE on are, in fact, stateless functions.
- The stateless nature of functional programming fits perfectly with the stateless nature of REST services.
- Someone who has the right permissions could PUT their own function definition into the system, and then POST data to invoke it.
- The functional language could reference other functions, naming them by URI.
- Functions in the system could take advantage of all the meta-patterns that functional programming provides, like mapping, reducing, filtering, composing, joining, etc. I bet you could even generate lambda functions.
- URIs are long, so you’d probably want some sort of aliasing feature 😉
- The input for POSTing could be a combination of the usual resource representation, like JSON, and URI references to other resources.
- Monitoring would be hell. I think you’d want to have some sort of CPU meter and an automated kill switch, depending on how much leeway you wanted to give your users.
- The access control model would be interesting, since a wide range of data resources might be involved.
Interestingly, this is kind of along the lines of a system I put together about a year ago, where I used Java reflection to map URIs and POST bodies to a Command-pattern API that we have internally. At the time, I didn’t really really think about it as a “functional” (well, it was functional in the sense that it worked and people were really happy with it). I was just mapping URIs to the Command objects in the API using Java reflection. I didn’t think too hard about the big picture, so I don’t think it counts.
It’s kind of an interesting idea. I did a search, and haven’t seen any other references to “functional REST”, but I’ll keep my eyes open. With all the functional programming wonks running around, it’s just a matter of time before someone puts a system like that together. …Someone probably has already.