An interview with Julie Moronuki
  • July 18th, 2019

Julie Moronuki, Author of Finding Success (and Failure) in Haskell: Fall in love with applicative functors

1 H 27 MIN
In this Episode

Julie Moronuki is the author of the Leanpub book Finding Success (and Failure) in Haskell: Fall in love with applicative functors. In this interview, Leanpub co-founder Len Epp talks with Julie about her background and her curious path to writing about the Haskell programming language, philosophy and linguistics and Heidegger, monads in programming versus monads in Leibniz, her book, and at the end, they talk a little bit about her experience as a an author.

This interview was recorded on June 13, 2019.

The full audio for the interview is here: You can subscribe to the Frontmatter podcast in iTunes here or add the podcast URL directly here:

This interview has been edited for conciseness and clarity.


Finding Success (and Failure) in Haskell: Fall in love with applicative functors by Julie Moronuki

Len: Hi, I'm Len Epp from Leanpub, and in this Frontmatter podcast, I'll be interviewing Julie Moronuki.

Based in Montana, Julie is an author, speaker, trainer and consultant who creates books and courses and other teaching and training materials, with a particular focus on the Haskell programming language.

Along with her colleague Chris Martin, she runs the consultancy Typeclass Consulting. You can sign up for their courses and materials at, and you can find out more about Julie on her website, and follow her on Twitter at @argumatronic.

Julie is a co-author of a Leanpub book Finding Success (and Failure) in Haskell: Fall in love with applicative functors. In the book, Julie and Chris walk you through the creation of a program in Haskell step by step. The book is meant for readers who are getting started writing in Haskell and want to speed up their understanding through quick and clear examples and exercises, and actually doing it.

In this interview we're going to talk about Julie's background and career, professional interests, her books, and at the end we'll talk about her experience self-publishing.

So, thank you Julie for being on the Frontmatter Podcast.

Julie: Thank you for having me.

Len: I always like to start these interviews by asking people for their origin story. You have a particularly interesting one, with respect to how you came into teaching Haskell. Can you talk a little bit about where you grew up, how you came to have an interest in Haskell?

Julie: Well, where I grew up - that's a really difficult question. I've moved a lot both in my childhood and as an adult. The number of states I've lived in, I think, is in the double digits. I lived in Japan for a while as well.

I have a Master's degree in Linguistics, and I had taken some time off. I have been a librarian, and I was doing some teaching online. But I was taking some time off from full-time work at least, when my kids were younger.

And I met a person on Twitter, Chris Allen, who was the co-author with me in my first book. He thought it was really interesting to meet somebody who was not a programmer, but had some interest in logic and related things. He sort of convinced me that he would really like to try teaching Haskell to somebody who'd never programmed before.

Haskell does have a reputation for being difficult to learn. And most people who learn Haskell - it's not their first programming language, they've learned one or more imperative or object-oriented languages before they come to Haskell.

So he had this idea that teaching it to at least one person who never knew programming before, would give some indication of whether the difficulty with teaching Haskell was because people were coming to it from a totally different paradigm background, and the paradigm shift required to learn Haskell was what was making it hard - or whether it was something else.

So we started doing that. I never thought I would like programming, and so I didn't really think I would stick with it.

But I heard this talk. There's a saying, and I don't know who originally said it, but there's a saying that a good type system should make any legal program writable, and make you unable to write any illegal program.

That interested me because, when I was a linguist, and I was working in a generative syntax framework, the idea of generative syntax is to come up with a set of rules - rules that could generate in a legal sentence, in a language, and not be able to generate any illegal sentence in a language. It's very, very difficult to do that. And so even for really well-studied languages like English, it's very, very difficult to do that. And so it interested me, that connection between this idea of type systems, and this idea of generative syntax, and how they might be connected.

I started getting more serious about learning Haskell after that. I was contributing more to the book, so that then I became a co-author of the book. And that's how I got started. I've still never really held a Haskell job - and so in some sense, I don't really feel like a Haskell programmer. But I've chosen instead to focus on teaching other people Haskell and doing more Haskell research.

Len: It's so fascinating, the story that you have. As a Linguistics student, you'd been working on a First Nations language -

Julie: Yes.

Len: I think it was particularly with respect to verbs?

Julie: Yes.

Len: ...and the role that verbs played in this language. And it was that work that sparked something in you, and you learned about what Haskell was.

Julie: Right.

Len: I was wondering if you could talk a little bit more about the connection there? Because you have a background in philosophy and linguistics from your university years. And there was a connection between these two things, with respect to formal logic.

Julie: Yes, right. You can kind of think of verbs as functions, and so verbs take a certain number of arguments. The work that I did that was concentrated on a Salishan language, called Coeur d'Alene - which was spoken roughly in the Northern Idaho area. It's not quite dead. It seemed like it was going to die at the time I was doing this work, but there have been some revitalization efforts that are very exciting.

Anyhow. There were a group of us working on doing an analysis of these texts that were collected by a linguist named Gladys Reichard in the 1930s. She had provided some translation of these texts, and also some very rough, what we call morphological analysis. These are languages that tend to accrete a lot of prefixes and suffixes on a word, rather than have like a lot of individual words in a sentence the way English tends to do. And so she had broken some of the words up into some of their component parts, and indicated what some of them might mean. But we were trying to do that more rigorously and standardize them somewhat.

I was involved with that in graduate school, and I became really interested in the argument structure of verbs. The argument structure of verbs is really very similar to talking about argument structure, or talking about the arguments of a function in a programming language. We do have zero-argument verbs, and some verbs have variadic argument structure. They can take different number of arguments, depending on the context. So, that's what I was working on, and -

Len: And what drew you to philosophy and linguistics in the first place? Is there anything that you can say about that? I mean, I know these kinds of things just kind of come out of people sometimes, but was there anything specific? I mean, it's the same for me - if someone asked me that question, I'd have a hard time answering it. But is there anything you can say about that?

Julie: Well, when I went to college, I always knew I wanted to major in philosophy. I really got interested heavily in philosophy, my senior year of high school. I was a debater. I don't know much about competitive debate, but I was a Lincoln–Douglas debater. When Lincoln–Douglas debaters debate, there's two kinds. There's Lincoln–Douglas debaters who are contrasted with policy debaters. Lincoln–Douglas debaters are debating questions of values - questions of whether something should be the case, or whether something ought to be the case. Rather than with policy, where they debate very technical questions of fact - the Lincoln–Douglas debaters are more about debating ideas. The policy debaters that I know are going to kill me for saying that facts aren't ideas.

But anyway - I got really into being a Lincoln–Douglas debater, and I remember, one of my best friends that year was really into Kant for some reason. Which I think is unusual probably, for sophomores in high school. He was younger than me. He was really into the categorical imperative, and just all things Kant. I really felt behind, because I moved right before my senior year of high school. The school where I had gone before was really rural, and nobody read philosophy there - and I felt really behind.

So when I got up there and I realized, I'm surrounded by all these kids who are talking about Kant and Plato and all this stuff, I felt like I had a lot of catching up to do. So I read a lot of philosophy my senior year of high school. I was in a debate actually, where I had debated this topic already several times. I forget exactly what the proposition we were debating was, but something to do with democracy. And I thought I knew what everybody's counterarguments already were. And then the guy I was debating in this one round, stood up and said, "Well, according to Plato, democracy isn't even good." And it just completely threw me for a loop, nd I was like, "Okay I have to read more. I have to catch up on this, because I can't be thrown for a loop like this." So that's when I started reading a lot of philosophy, and I knew going into college that I wanted to study philosophy.

In my first year of college I took an introduction to logic and a survey of Western philosophy, and I also took a philosophy of law class. And they were all really, really interesting. So I stuck with that through the whole four years, and even in grad school I took a couple of philosophy classes.

But then linguistics, actually - it just happened. I took an intro to linguistics class as an elective one semester. I didn't know anything about linguistics before I took that class, and I didn't know that I would like it so much. But I just loved it - and I instantly added it as a major, and started taking linguistics classes.

A lot of philosophy is already really talking about language. Because there's a lot of philosophy focused on analyzing meaning, and the logical structures of language. I think there's a really immediate connection. But with linguistics then, it was that structure of language. But unlike the philosophers, we were gathering empirical data about it - and seeing if our theories actually fit the data that we can see in human language around the world, not just the couple of languages that we happen to speak.

If you speak say English and German, and you're comparing them and trying to get some deeper idea of what language is all about - well, they're closely-related languages, so you're going to have a very skewed perspective. It interested me to start seeing the data from a whole bunch of different languages that really share very few things in common, and then, what can we really say about the universal properties or structures of human language? I think it was a really natural fit for my interest in philosophy, to that.

Len: Thanks for sharing that story, you're reminding me of some very long lost memories of debating in high school. I unfortunately paired with someone who was vain and ambitious, and not very smart. And so the way it worked in the school where I was in in Canada - in Saskatchewan, just north of you in Montana - was that the final words spoken were referred to as "the Prime Minister's Address," or something like that. And so my partner, being vain and ambitious and stupid, always wanted to give it. If it had been called "the Subordinat's Address," he wouldn't have wanted to do it.

Julie: Right.

Len: But because it was called "the Prime Minister's Address," he wanted to give it. And what he would do is, when the opponent was giving the second last statement, he would be writing out on paper word-for-word what he wanted to say - without listening.

Julie: Oh.

Len: I know. Just like, dumb. And you could just see the judges, while the opponent was speaking, they would see what he was doing and just be like, "You lose."

Julie: Yeah.

Len: But anyway, I wanted to I wanted to ask you about this. Actually, you brought up the categorical imperative in Kant.

For those listening who might not know, the categorical imperative is this very important concept in philosophy and politics, according to which, basically, you can only justify an action if it could be accepted as a universal rule.

So if you could say, it would be acceptable for anyone under similar circumstances to do a similar thing, then something's okay. It's really interesting, because it's exactly the opposite of another very popular political idea, which is, "Why should I pay for this?" The "Why should I" question.

There's this great podcast based on an organization called Intelligence Squared in the UK, where they debate, they bring prominent people in front of a crowd, to debate a question. And they poll people before the debate, and then after the debate, to see how it turned out. And there was one that was about NATO, or something like that. And there was a guy who got up and said, "I'm from Texas, why should I care about NATO?" And there's a connection between these two things - of making politics about everybody, and making politics all about yourself.

I'm not really sure what I want to ask about that, it's just something that I've been thinking about a lot lately. Because the whole point of a debate is to be persuasive to other people, and I guess that's probably what sparked me, was the thought about my debating partner, for whom it was all about himself - and who ended up embroiled in a political corruption catastrophe later.

Julie: Oh no.

Len: Yeah. But anyway, this is a way of saying that - the kind of things that people talk about in philosophy are really important to our day-to-day lives. And so I wanted to ask you a particular question about philosophy, I warned you about this before we started recording. But, so - you were talking about Heidegger on Twitter.

Julie: Yeah.

Len: For those who might not be aware, and I'm going on way too long in a podcast interview with someone else, but just to explain a little bit. So, Heidegger was a 20th century philosopher who wrote a great deal about a great many things, particularly subjects like phenomenology. He ends up in the Venn diagram of - his philosophy, it overlaps many things, including existentialism. And another thing that it greatly overlaps with, is Nazism. He was a, an unrepentant Nazi. He endorsed it at the time when many, many, many other people and his colleagues were very dead set against it. This is before the Second World War.

I'm just going to I'm just going to read your tweet back to you. This is totally unfair.

Julie: Okay.

Len: But I know you're tough and you'll defend it. I should say, there's this debate in philosophy about, what should we do with Heidegger? Because much of his philosophy would appear to have nothing whatsoever to do with the Nazis. But then, there he was - this unrepentant Nazi. And he would claim that it was from his philosophy that he got interested in this Hitler guy. And there are many people who say, just to close this off, "Oh no, we can separate at least part of his philosophy from his Nazism."

And so you wrote, "after i learned about it, i could see, reading him, how his own arguments led him to that. so i object when people try to make bringing up his Nazism seem like an ad hominem fallacy. it's a thing that has to be contended with in any honest analysis of his arguments."

Rhat's one of the best tweets I've ever read, and I wanted to ask you - how did you see his Nazism in Heidegger’s philosophy?

Julie: It's been a while since I've read Being and Time now, so I may have to be a bit hand-wavy about Heidegger's concepts. But I think for a while there people were trying to really say that the two things could be disconnected - that maybe even a lot of academics felt forced to become Nazis, but they didn't really believe in it. I think that - I mean, in particular - not just in Being and Time, and some of his philosophy of technology is perhaps less connected, but I think in "Being and Time, when he's talking about - the way he talks about being thrown into a culture, and the ways that we have connections to other people, and the ways that people - yeah, I'm being very hand wavy. But the ways that people who are like each other are going to have more natural sympathies, and they kind of belong together - I felt that that you can really see the seeds of a kind of racial or ethno-nationalism there.

I don't know that you can really separate the anti-Semitism from Nazism. But I think you can see the seeds of the ethno-nationalism - not particularly the anti-Semitism, but the ethno-nationalism there - in the way he feels that we're connected to other people around us. I think there are other ways to interpret the care relationships and the kind of dialogic relationships and the inter-subjectivity.

I think there are healthier ways that we can interpret those. And so, I think that the book still has something valuable to offer. But you kind of have to acknowledge that taken in one direction - this notion that our identity is inter-subjective and related to the identities of the people who are around us, can definitely lead you in that direction. It can lead to the white supremacy and white nationalism, because you think you have some connection with white people that you don't have with people of other races. Or, in the case of the Germans, that you have some connection with people who are racially German - and not these invaders, these outsiders - who don't feel the same objectivity with you.

Len: It's really interesting, thanks for bringing up the inter-subjectivity thing. And there's another element to it as well. I was saying before we started this interview that many, many years ago, I was asked in a defense of my Master's thesis, "What role did Kant play in bringing about the Nazis?" And it's haunted me ever since, because I didn't have a good - I mean, I gave a clever answer, but I didn't have a good answer.

And one interesting feature of these, let's say, late 18th century to early-to-mid-20th century German philosophers, was the idea of having a total system. That's what philosophy was about. And they had what to many people nowadays would be a really weird kind of world historical view, that would drop out of this idea of having a total system.

It meant that your philosophy needed to explain actual human history. And then just given the particular nature of - let's say the religious and cultural world they were coming from, this meant you had to explain the Jews.

And so it couldn't be historical accident, about the diaspora and things like that. And even particularly for some philosophers explaining this - it's so controversial, and has such a fraught history - but the claims particularly on the part of Catholicism, about the Jews killing Jesus.

It's so fascinating but perverse, to think of having to - you're writing a philosophy that might be like Kant, about so many things, about reason and politics, perception even - and then you've got to tie all that into the history of the Jews.

And so it can end up-- It can seem to a contemporary reader - well, you don't even notice what's really going on underneath a lot of what's being said, because you just think it's about perception, or it's about the politics.

Julie: Right, yeah, when I took a course on Nietzsche in college, the professor that I had - we talked a lot about how the Nazis used Nietzsche to promote themselves, and this Aryan ideal - but my professor was really sympathetic to Nietzsche, and thought that he had been wildly misinterpreted. And so he gave this whole alternate reading of Nietzsche, in which Nietzsche's anti-Nazi. I don't necessarily think that he was wrong about that, I don't necessarily think that he was wrong that Nietzsche was being sarcastic in some of the things that then the Nazis took literally.

But it's also a plausible story that Nietzsche fits into that history of German philosoph, in that he was being more literal, and that the Nazis weren't wrong in the way that they interpreted him.

And so I think that people need to be really kind of careful about what they say, and what the consequences - how that leads people to reach certain conclusions. And maybe if you didn't intend those conclusions, then maybe you need to rethink what you're saying. I mean Nietzsche’s dead, and died long before World War II - so he didn't really have an opportunity, if he would have rephrased, but -

Len: It's really interesting, you're reminding me of something else actually I found that you wrote about your opposition to philosophical hero-worship, and how you wrote that the first two philosophers who really spoke to you we're not really very admirable people.

It's interesting, for some people - and I get the sense that this is totally true for you, and it's totally true for me - the concept of entertaining a thought, rather than holding a thought, comes naturally, but for a lot of people it's not like that. They think that if you're writing a paper about Nietzsche, unless you're expressly denouncing him, then you must be a proponent of his. That for example, if you take a course on Buddhism, that means you're becoming a Buddhist, or something like that.

It's these very different mindsets.

That actually leads me to, so the next question I want to ask you was - getting closer to the tech space which you're now a part of, and have been for a few years now - you wrote - this really struck me:

"tbh having a philosophy degree means having a four-year degree in giving sexists the benefit of the doubt, and it barely caused me a moment's pause. but the difference between that environment and the one i currently work in is staggering."

Julie: Oh.

Len: I've got two questions from that. What is it that makes the philosophy environment do you think, so toxically masculine, so often?

Julie: I mean, even though by far the majority of like my professors in the philosophy department and my fellow students in the philosophy department - the men outnumbered the women, [but] I didn't really feel like it was a very toxically masculine space. I always felt - at least in my own program and stuff, and maybe I was just particularly blessed - but I always felt like it was all right, it was definitely expected that we would exercise the principle of charity in our reading.

And so we would not just find that Aristotle was sexist, and therefore we're going to dismiss everything else that he says. Because then we would have to be dismissing so much of the history of Western philosophy. But that your arguments against him, against the more sexist things that you would read, or the arguments that you were told - would always be bracketed by, "Okay we have to assume that these days, he would accept that this also applies to women."

And so I never really felt like there was this kind of - well, I guess I'm becoming more familiar with just calling it misogyny, because I'm reading Kate Manne's book, Down Girl, right now, and if we think of misogyny as not, particular actions being sexist, being overtly sexist towards other people, but in fact a system by which we try to keep women in certain roles - I never felt like my philosophy department, at least, was like that. I always felt like me and the other woman there were full and equal participants in the dialogue, and that our criticisms of philosophy were taken just as seriously as the other students. And nobody said that we should be -

I mean, one of the things that I hear a lot in the discourse in tech is, so women will bring up something that is clearly sexist, or bring up this kind of culture of misogyny in the tech world. And instantly they'll be asked not to have more empathy for the men who are sexist. I guess there's a relation to being asked in philosophy to read all of these philosophers in the most charitable way possible, right? I guess there's a connection between those two things, but here it seems much more like a silencing mechanism. Whereas in philosophy, it's like, "Okay, if you don't read these things as charitably as possible, then we will never get anywhere. Because all of our time will be spent, we'll just have to dismiss them because they are clearly sexist."

Whereas in tech, it seems like we can't really have an honest conversation about sexism - because such arguments are dismissed out of hand. So the charity really only goes one way. And the, I think for the philosophy world, it didn't. It went both ways. We were supposed to read philosophical texts charitably. But our arguments against them were also listened to charitably. Because of course, sometimes we made bad arguments against them, right? Those arguments were also listened to charitably. And I feel like in tech, it only really ever goes one way. And so the arguments that there are these problems with misogyny in the tech world are not listened to charitably.

People are going to argue with me about that. Because of course in Haskell, everybody thinks that the quote unquote "SJWs" are taking over the world and oppressing the white men. So people are going to argue with me that it's not being listened to charitably. But I stand by my words.

Len: If you're up for talking about it - I was very happy and surprised to hear you bring up the concept of charity. This is one of the driving concepts behind my own experience of reading philosophy - the idea behind a charitable reading, or listening to of someone else's argument - it's not about being nice, it's about - someone is saying something, or you're reading something that someone else has written - and you relate to it as though it means the best and most complex thing you can get out of it.

It's about bringing your best to what you're reading, and this is where the concept of entertaining a thought -

Julie: Exactly, yeah.

Len: ...becomes important, right? You're not saying, "This is what the person intended, this is what the person meant." But, "Taking these words, what's the most complex thing I can see in them?"

And this is exactly the opposite of the - I think his name was Justin Damore?

Julie: Yeah.

Len: The guy at Google. It's exactly the opposite of that attitude. It's exactly the opposite of the siren song of the Jordan Petersons of the world, who ask you to bring the least of yourself into your examination of what other people are saying.

What's your experience been of seeing that? Particularly this phenomenon of what - I mean, it's a profoundly anti-intellectual movement - which is not an insult, by the way - an anti-intellectual movement that characterizes itself as intellectual, under the auspices of the Jordan Petersons. And there's this guy whose name I can never remember, who's a neuroscientist - who got in a big fight with Ezra Klein. Anyway -

Julie: It's funny, because in college one of the most dreaded classes for a philosophy major, you had to pass it with a C or higher - it was required for the major - was this class in formal logic. And it was one of our only interactions, I suppose, with the people who were majoring in STEM fields. Because for some reason it was an elective for Computer Science majors - I believe? Because we talked about Turing machines, and we talked about decidability and the lambda calculus and formal logic questions.

So, that was one of my only interactions with the Computer Science majors on our campus. And they all clearly had the idea that they were more rigorous and logical than we philosophy majors, right? Particularly, probably those of us who were continental philosophy majors. So I guess I had to some degree, internalize this idea that, "Well, programmers are going to be logical people." But of course that can mean different things, and so - it doesn't necessarily - just because you're able to reason through programs or a mathematical proof, that doesn't necessarily mean that you can reason through verbal arguments about society and values and culture, right?

Because those are different things. They don't quite submit to precisely the same kind of logic. Those things tend - they're not quantifiable in the same way that questions in math and programming might be.

But I did come to this with this expectation that programmers are all going to be really logical, and they were going to be really open to listening to reason. And I've just not found that to be true, as long as we're talking about any kind of cultural question. Even questions that are about tech culture itself. There's always this - people arguing about whether or not static typing is good. And the static typing evangelist - Haskell is a statically typed language - and so the Haskellers, a certain subset of the Haskellers - take this really hardline stance pro-static typing, right? All the languages should be statically typed. And then there's other people who get angry about that, and are, "No, statically typed languages are too hard." And so there's this constant clash about this. And it's like they're not listening to each other - and it's not just Twitter. It gets blamed on the medium of Twitter a lot, but it's not just Twitter. In any forum where they're talking to each other, you can see the same kinds of talking past each other that go on Twitter. Just in Twitter, it's some shortened form of it.

And so I really wish that - yeah, this idea of being able to entertain the thought. Being able to ask yourself, "Alright, this thought - it is repellent to me, perhaps? But let me entertain it for a few moments; what if it were true? What kind of arguments could be marshaled in its defense? What kind of evidence could be marshaled in its defense?" And because that's what really helps you find, like - maybe you've had some kind of initial emotional reaction against something. Certainly I do all the time, right? I read something, and I think, "Ah, this is sexist and it's terrible."

But that's not really a helpful - I mean, it's fine for Twitter to just react to things, but it's not very helpful long term. You have to think, "Okay, beyond my emotional reaction - if I held this thing to be true for just a moment, and thought as well as I can, :What if it were true? What if I'm wrong? Then, what can I get out of that?" And in the end, it makes you understand yourself better, and it makes you understand other people better. But it also makes your own arguments more reasoned and interesting and more likely to be true.

Len: It's really interesting, this, I guess, dialectic between the strictures of formal logic that you find in language, and the arbitrariness of culture.

Julie: Yeah.

Len: And it's the latter part that I think, there's a certain type of mindset, that finds it very difficult to embrace.

They'll say that like, "Well no, that word doesn't mean that - because, look it up in the dictionary." And it's like, the dictionary is just one thing, that establishes the meaning of a word. Other things include the context, and that context is historically arbitrary.

You brought up brought up continental philosophy. One of the things that I found fun researching for this interview, is the totally natural way that you have managed to embrace the formal logic side of things, and the arbitrary cultural continental philosophy kind of things. Which is, I find, quite rare. Most people kind of fall on one side or the other.

Julie: Yeah, dogs and cats lying down together, right?

Len: Yeah, exactly. So, for those who kind of are slightly offended perhaps, because they sense that they're being targeted by - if I'm talking about people who have problems with the arbitrariness of culture or language, they've got lots of friends in philosophy. There was a guy named Rudolf Carnap - for example, and logical positivists.

Julie: Yes.

Len: Who would be very much on their side - they tried to kind of amputate history and culture from philosophy.

There's a great line - Carnap's got this piece called, in English The Elimination of Metaphysics Through Logical Analysis of Language. It always strikes me how naive this stuff is. But he writes, "Whether or not these questions can be answered, it is at any rate unnecessary to worry about them; let us devote ourselves entirely to the practical tasks which confront active men every day of their lives!" Exclamation point.

That's hilarious, from a certain mindset. From another mindset, it's like, "What could be more reasonable than that?"

Julie: Right.

Len: Let us set aside these things that can't be decided, and focus on the things that can be decided.

Julie: Right.

Len: It seems to me that one of the explanations for why the Jordan Peterson types think that they're intellectuals, and think that they're philosophers - is that they are thinking, but they're not thinking curiously. What they want is answers. If you know what I mean?

Julie: I do know what you mean. And they want answers for very specific questions, right? I just read a great - he's actually on Twitter, I think he's @lastpositivist. He's a Carnap fan, and but he wrote a great blog post the other day about what logic is. He talks about how really being logical shouldn't lead you to answers, it should lead you to new questions. It should lead you to new ways of looking at the world and trying to see other people's point. Because you should be trying to come up with models of the world in which things that other people are saying are true. And maybe they're not true in our world - but you should at least be trying to, and that should lead you to new questions.

And so it's funny, because coming from a guy who identifies as a positivist, and as a big Carnap fan - it struck me as slightly funny.

But I think he's right. For me, that's what logic and philosophy are all about. You should always be looking for new questions to ask.

I have this story that I tell people sometimes, because I think it's quite funny. But it got me talking about something with Chris Martin - my current business partner.

There was a time in college when I joined this group, one of the campus groups, they were called, "The League of Evil Physicists." The guy who was the leader of the group, the President of the club or whatever - he insisted that Aristotle was not a philosopher. I don't know why this came up in conversation so many times? But eventually I was asked to leave The League of Evil Physicists, because I kept insisting that, "No, indeed Aristotle is a philosopher."

I think that when philosophy is asking the kinds of questions that can be answered, those tend to then get shunted into other fields. Like if you're asking - so, a lot of the philosophy of math started out asking questions where, "Well, now we have some answers." Some of the questions that they were asking - for example, about decidability - now we have some answers about that, and so now it's not considered to be philosophy as much anymore. Now it's math.

And some of the questions that Aristotle was asking, some of those now have answers, right? They have answers through science, and so they're not considered to be philosophy anymore.

I think there is some perspective under which I can understand his insistence that Aristotle wasn't a philosopher, he was a scientist. But it also seems, such a narrow insistence - or an insistence on such a narrow definition of a word, that I just couldn't tolerate it. Besides that, scientists don't write books of ethics.

Len: Well, unfortunately they sometimes do.

Julie: Unfortunately, yes.

Len: It's a curious phenomenon. It's really interesting actually - because being an intellectual and being a philosopher, brings with it - we all accept that there's a kind of elevated status that comes from that.

And so, people who desire elevated status get attracted to it, even though they actually have no real interest in intellectual endeavors, whatsoever. And so they put on their glasses like Rick Perry, or they put on their bowtie, or they put on their tweed jacket with the leather elbow patches, or even become professors, and think, "Now I've got that elevated status," which is what they're really after. But what they're doing is not intellectual or philosophical at all.

It reminds me of -I had this encounter, I'm sure you've had some encounters like this too - but I got in a debate in high school with someone who was a creationist. I was arguing for evolution, and he was arguing against it. To be clear, and this this was at a Mennonite boarding school in rural Saskatchewan, so it became quite a heated debate, and there were lots of people listening.

And I remember my opponent saved the best for last. It was obvious that the position that I'd been taking had kind of won the day, and then he brought out his secret weapon, which was, "But if evolution is true, then why are there still monkeys?"

What's interesting about that - I've thought about that since then - is the solipsism of it. The rhetorical nature of the question. It's like -if you stop thinking yourself, about the questions that you're asking, that's when you know you're not doing philosophy anymore. Because it's a constant challenging of yourself, that you really need to be engaged in. There's other forms of thinking, they're just not philosophy.

Thanks for being game for talking about all that pretty heavy stuff, but it is related to what brought you into the Haskell world.

And so, moving on to the next part of the interview - for those who don't know anything about it, what is it that sets Haskell apart from other programming languages, and makes it so attractive to people with a philosophical mindset?

Julie: I think there are several things, and one of them is probably because Haskell started off life as a research language. It wasn't really intended, at least originally, for industrial production programming. And there's still a lot of research that goes on around Haskell, and trying out different improvements or extensions, to, for example, the type system. And so, being really involved in Haskell still involves a lot of debating about what is the optimal type system.

Within Haskell, there is a fair bit of that experimentation and debate going on. But also several of the languages that are post-Haskell, but related to Haskell pretty clearly - like PureScript and Idris - they're asking different questions, or they're taking some things that we've learned from Haskell, or some questions that have come up during these debates - and they're thinking, "What if we built a language around this idea, instead of what Haskell did? What if we made some different choices with the type system?"

And so there's a lot of, I mean that is a certain kind of philosophy, right? That is a certain kind of philosophical question. What is optimal for this human computer interaction of programming? Because a lot of what you're trying to do when you talk about type systems, is come up with some way to ask the computer to help you reason through a complex program. That's part of what type systems are for. If we go back to the idea that type systems should help you generate all the legal programs in your language. There, I said it much better this time - and not let you generate illegal programs in your language.

So, to the extent that we can encode different type systems in a computer, and the compiler can figure out your types for you, to a certain extent, then, the debate there, is a philosophical question. "What's the optimal balance between what the computer should be doing to help program, and what the human should be doing?" And, "How can there be a cooperation there, instead of just -" I don't think Haskell's currently at that optimum. But I think it's important, because right now, it's the one that is, in my opinion, closest to the optimum - while also being a fast enough and secure enough, and so forth, for industrial programming.

Right now I think it strikes a balance that few other languages are doing, where we do have some help reasoning about the logic of our programs from the computer, because the computer is type checking programs. That's not a perfect system by any means, but there is some help there. Instead of just, "Well I wrote a thing, and let's run it and see if it blows up."

Len: I know in your pedagogical practice, practical examples, and working through them, is a very important part of teaching.

Julie: Yes.

Len: Just talking about something is very important. But working through something specifically is also very important. And so you've talked about how addition - and I'm trying to draw the connection between what's happening in the rough-and-tumble, very practical hands-on world, of what a computer is doing, and what people are doing in their calculations, and how we describe them. And you've talked about how addition is disjunctive.

Julie: Oh yeah.

Len: Is that right? And multiplication is conjunctive.

Julie: Yeah.

Len: I was wondering if you could just explain that a little bit? Because you've you also got a really great talk on YouTube about how metaphor underlies math.

So, if you could maybe explain a little bit about what it means to say that addition is disjunctive and multiplication is conjunctive, I think that'll give us a really practical hands-on example of this intersection of logic, and what we're doing in our day-to-day activities, calculating.

Julie: Okay, so the disjunctive and conjunctive is coming from Boolean logic, where the idea is that with, say a normal Boolean disjunction - which is an "or" - you've got true or false is, equals true, right? And the only time you get a false is when it's false or false, so, when both sides, when both arguments are false. So if we think of false as zero, if we were going to encode this in a binary system - because it's a two valued logic - it's analogous to binary arithmetic with a zero and a one. So if we think of false as being zero, then, in the same way that false is an identity value, we call it for disjunctio; zero is the identity value for addition.

And so the two operations are very closely related. There's other ways that they're related, and if we talk about set theory, then we can see how they are related through what's - I guess it would be through disjoint unions? So when you take the union of two sets, right? If the same element appears in both sets, then we would get rid of one of those copies, right? Because each element in the set should be unique, and so when you take the union of two of them - if there is overlap, then we get rid of those extra elements.

But if you take disjoint unions - a disjoint unions tag, essentially carry information about which set they came from, and so the number one coming from set A, and the number one coming from set B - then, are unique. And so we can keep both of them then, and only take the union of the sets. And so then there's also a correspondence with addition and with Boolean disjunction. Because they behave the same way, and we can encode them all the same way through like binary arithmetic. So then we see that multiplication and Boolean conjunction - with Boolean conjunction, true is the identity value. Which would correspond to one in binary arithmetic.

And you only get a true because it's like an "and." So you only get a true if both sides are true. And so true and false is false, and all the rest of them are; all the rest of the pairings. And so that corresponds to multiplication, where multiplication - if we think of false as zero and true as one, one is your identity value for multiplication. Where anything you multiply times one, it returns that other argument, right? No matter how big the number is, no matter how small the number is - if you multiply it times one, it's whatever that number is.

It has the same relationship in Boolean conjunction - if you think of true as one, and false as zero. And you can join them. Then you get a one only when it's true and true. And the rest of the times the zero, which we might call the absorbing element or the annihilating element - I really like calling it "the annihilator" - that is a mathematical term. So it'll destroy its other argument.

Len: Sorry to interrupt. Just from - so, being a non-technical person myself, and apologies to anyone listening to this for whom everything is really obvious. But the identity value in addition is zero, because if you add zero to something, you get the same result.

Julie: Right.

Len: And the identity value that corresponds to zero, corresponds to false. But the identity value in multiplication is one, because if you multiply something by one, you get the same result.

Julie: That's right.

Len: And one is like true, and zero is like false.

Julie: Right. So when we talk about an identity value, it's always an identity value with respect to both a set of values and a specific operation. So there’s an identity value from say the integers for multiplication. But there's not just an identity value in the integers. Does that make sense? It's always with respect to some operation, so -

Len: Right. And annihilator, that - I mean it's just fun to say - is that like, I take anything and multiply it by zero, and I get zero.

Julie: Right. So whatever other information you had in that pairing, will get destroyed by the presence of the zeros. like when you do a set intersection, if one of those is the empty set, then it destroys everything that was in the other set. It just blows it right up.

Len: There's something about this that's related to the-- I think there's a concept in Haskell that you can't have an empty list. Is that right, or am I totally making that up?

Julie: Well, we have empty lists, and then we have another data type for non-empty lists - where you're guaranteed to have no empty lists. But when we're talking about lists - the normal thing you do when you join lists is called concatenation, where you basically take this list and this list and you add them together into one list. And that doesn't change anything in either of the lists, right? It keeps all the elements, it just joins them into a single list.

But we have another way that you can join lists, where you join them pairwise, and you make pairs. So if you've got a list of one, two, three and a list of four, five, six - then you make little pairs of like one-four, and two-five, and three-six. You make pairs, and your new list then is this pairwise joining of the lists. And for that one - because that corresponds to products or conjunction - the empty list will also destroy that. You can't make a pairing, like a pairwise list of two lists if one of them is empty, so--

Len: Okay, and since this is the interview of easy questions - I'm joking - the next question I wanted to ask you is the one that I'm sure everyone who knows about Haskell has been waiting for me to ask. Which is, what are monads? I've got a kind of joke, when I first encountered this I was like, "Oh, Leibnitz."

Julie: Right, me too.

Len: And I started talking about it, and my computer programming colleagues were like, "What the hell are you talking about?"

Julie: Yeah. I was like, "So, what, we have like little gods in the type system, what is this?"

Len: Or like every part of the universe has the whole of the universe in it, that kind of thing.

Julie: Right, right.

Len: But, so, in Haskell terms - and I know this is actually kind of a fun subject of debate about burritos and metaphors and things like that. But so, how would you explain what monads are to people who are getting into Haskell?

Julie: Okay well, I think that they're kind of hard to explain to people who don't know anything about Haskell. Although I've seen some really good write-ups about what they are, with like JavaScript. But, alright - so what we've been talking about with the relationship between addition disjunction and list concatenation, where we add two lists together and set disjoint unions. When we consider the relationship between those things - how they all share certain properties, and we can re-encode those in terms of each other. Does that make sense so far?

Len: Not exactly, but it doesn't need to make sense to me, it needs to make sense to people listening. I'm not smart enough.

Julie: No, I want it to make sense to you, so -

Len: Okay.

Julie: We talked about the connection between addition and Boolean disjunction, how they both have in some sense the same identity value, for example. And so there's this connection between them. And we can abstract away from the details about these different sets. Say, the set of integers and the set of Boolean values. If we consider each of those are set, we can abstract away from the differences between those. Because there clearly are differences, right? Like between the set of integers and the two valued set of Boolean values, right? There clearly are some differences.

But if we abstract away from that, we can call that - that's called a monoid. A monoid is a set. For example, Boolean values or integers - along with an operation like addition or Boolean disjunction. But we don't have to care about those details. That is an associative, so you can regroup it and evaluate it in different orders - does that make sense?

Len: Let me see if I get this, so -

Julie: It's easier with visuals, I swear.

Len: Yeah. I'm thinking back to one of your talks that I was just watching on YouTube last night. So is this the kind of thing where, let's say I've got two sides to an operation - there can be many different operations with two sides to them.

Julie: Right.

Len: And so you abstract away from whether it's addition that's happening, or multiplication that's happened, or a concatenation that's happening.

Julie: Right.

Len: But there are two sides to it. And that's what makes something - I mean, with respect to the type of thing that has two - and I probably shouldn't have used that word. With respect to the type of thing that has two sides, abstracting away from it - that's a monad of the kind that has two sides to it?

Julie: Close. We're getting close.

Len: Okay.

Julie: That's what we call a monoid, and there's a typeclass in Haskell called monoid that is for monoid operations. So, monad is a next level - a higher level monoid. It's complicated because monad is not just a monoid but also a functor. And so functors are -

Len: Also a fun word to say.

Julie: Yes. That came from Carnap, actually. The word functor comes from Carnap. So functors are - at their most basic they're just like, if we have a type - or a value, sorry - that has some other layer. Let's say you've got an integer and you want to do some addition to it, but what you have is not just an integer - it's an integer wrapped in some other type. Because in Haskell we have these things called Higher Kinded Types, which are types that take other types as arguments. So they're typed-level functions, and that's a lot to go into if you're not already familiar with Haskell. But if you want to do addition on that integer that is wrapped in some other type layer, you have to have a special function called a functor to get at that value. Does that make sense?

Len: Yeah, I think so.

Julie: Okay, and so a monad is combination of a monoid and a functor. So, you've got some integer, say for example - embedded in some other type context. And you want to chain - because monads are for chaining operations together. And so you've got, you want to apply first addition - for example, to that integer. And then you want to do some multiplication to that integer. And at the end you have to do addition on that integer, and then doing multiplication on that integer - let's say, would generate more type structure. And so then you have to like smash the layers of type structure together. So a monad - where a monoid is a set that has some operation like addition over it, that you can do with it, a monad is a set or a type that has such an operation for it. Does that make sense?

Len: Yes, I think so. I mean, at least for the next two minutes in my working memory.

I should say that one of Julie's really key points that she makes in all of her writing and speaking is that actually seeing examples of things is really important, and working through them. And so having these kinds of - explaining things or describing things at this abstract level is very important, but things only really start to make sense when you do them.

Julie: Yes. I wrote a blog post that attempts to explain what monads are for people. The ideal audience for it is someone who has programmed before - but not in Haskell, and just wants to know what monads are without a lot of extraneous information. It just goes through an example to demonstrate what monads are and what they're for and why we have them in Haskell.

Haskell's weird, because Haskell's really big on these abstractions. Most of these abstractions come from abstract algebra. So a monoid is a structure in abstract algebra, and a monad - and rings and groups and stuff. And Haskell took the idea that, well, the algebraists and the mathematicians, they talk about these structures. And a structure is a set and some operation over the set, and some laws that the operation has to adhere to. And what if we encoded that in the type system? So that's what type classes are all about. Typeclasses are about encoding these abstractions in the type system and then the sets in question are types, right? Haskell types.

A lot of people find that really off putting, because then there's a lot of mathematical terminology in Haskell. It's never really bothered me. I see how it could be off-putting to some other people, because when you first start learning Haskell, there's this real jargon overload. A point that I've tried to make is, whenever you start learning any programming language - I started trying to learn some Java, and we actually ended up writing a blog post for this as well, and there were all these terms that - I mean, I just had no idea what they meant. And but, so many people learn Java in, say - [audio cuts out briefly]

Len: Can you hear me?

Julie: And a lot of that Jargon comes from C. And so, if maybe you didn't learn Java in college - but you did learn C, and so you're already familiar with that jargon. But for me, coming at it from I learned Haskell first, and I'm comfortable with all of Haskell's jargon - and then the Java and C jargon is all just, I have no idea what they're talking about.

Len: It's really interesting. You're reminding me of something I think you said in a podcast I listened to, where you're like - because of your background in mathematics and logic and things like that, and linguistics. Haskell was just like an "Oh, I get it." kind of thing, when you first started encountering it. But the connection between HTML and CSS was a total mystery?

Julie: Yeah. I needed a book for that, because I just didn't - Chris Martin, that I work with now, he really understood them, and he really made it clear to me like what the relationship between the HTML and CSS was. But yeah, to me that was just not obvious at all. There's that GIF that always goes around of - it's from some cartoon that I don't know. But where he's like trying to adjust the blinds, and people say it's like using CSS where you just have to like keep -

Len: Oh, Family Guy?

Julie: Yeah - and you just have to keep like pulling on the strings and seeing what happens. He actually showed me that no, you can actually learn CSS. And if you think carefully about your CSS and its relationship to the HTML, it doesn't have to be like that. And that was really both eye opening and very welcome to me. It was very reassuring to me. I don't like just pulling on things and seeing what happens, particularly. I mean, I do a lot of experimentation with Haskell in - I do a lot of experimentation with Haskell, because I'm teaching it. And so I'm trying to find the ways that different things will work, right? Well, what will happen? Because some student will ask me, like, "What happens if you do XYZ?" I want to know what happens if I do that? So I do a lot of experimentation for teaching purposes, but if I'm actually sitting down to write a program, or if I'm actually sitting down to design a website - I just want to know what I'm doing to the largest extent possible.

A lot of my friends who are programmers say stuff like, "I just need to get in there and build it and learn while I'm building," and stuff like that. And to me, that's such a frustrating experience. I want to feel like there are correct ways to do this. And you can discover them, and you can learn them - and they're part of a reasonable system. And not just like, "Well, anything goes," and you've just got to hammer away at your keyboard like the 1,000 monkeys trying to type Shakespeare, or whatever, right? And eventually Shakespeare will come out. I don't like that at all.

Len: Before we move on to the last part of the interview, the last question I have to ask you about Haskell - so we've got Julie Moronuki here, who literally wrote the book on Haskell. And we built up these concepts so far of monoids, and monads, and annihilators, and functors - so, what are semirings?

Julie: Oh, I'm writing about semirings right now, actually.

Semiring is when you have two monoids, basically, that are in a relationship with each other, so - again, if you think about addition and multiplication - there's a relationship between addition and multiplication in a couple of ways. One of them is that the identity value of addition, which is zero, is the annihilator of multiplication. So there's that connection between the two. And the other connection is that multiplication distributes over addition. I know I learned that when I was in elementary school. We talked about distributivity and how - I always have a hard time doing this when it's not on paper. But I think it's like - if you have A times in parentheses B plus C, that's the same as A times B plus A times C. Does that make sense, okay?

Len: Yes.

Julie: Like I said, I'm really bad at doing that just in my head. And so, what's called "the absorption law," where there's that relationship with the identity of one thing being the annihilator of the other, and then the distributivity law connects like say addition and multiplication. And so a semiring is an algebra with some set - such as integers, for example, where you have two monoids - such as addition and multiplication, and those are binary operations that have identity values. And they're connected by that absorption or annihilation, and also by the distributivity. So integers under addition and multiplication are semiring.

There's also - Boolean logic also can form a semiring. Because there is that relationship between conjunction and disjunction. There are also some semirings that are different in which one of the operations is not addition, as we usually think of it. And so there are things that are a bit of a stretch, to see how they're related to those. But then Haskell's type system also forms a semiring, because we have what are called "sum types," and we have "product types." And the relationship between sums and products in Haskell's type system is the same - they're analogous to the relationship between addition and multiplication.

An so semirings are really interesting algebra, that I'm kind of getting into lately. Tropical semirings are really fascinating. They're one of the ones that I think are kind of an extension, they're kind of a stretch, to at first see how they're related to these other semirings. Because the other ones are a little bit more analogous to each other. And the tropical semirings are interesting, because they're a little bit of a stretch. And so I've been reading a lot about them lately, and they're quite fascinating, so -

Len: Thank you very much for that great description. Speaking on the subject of hard things, you co-wrote a book.

Julie: Yes.

Len: You've done it a couple of times. But writing a book with another person can be very hard.

How did you and your current business partner, Chris Martin, work out a process for writing together?

Julie: Our process for writing together, I think, is quite different from the process I went through for the first book. Chris and I work well together, because we have really distinct strengths and weaknesses. I really like writing with him, because he always makes me see things from a perspective that I just couldn't see before. It's not just because he's been a programmer for a long time, and that was what he majored in in college, and he knew he wanted to be a programmer when he was a kid, and he became a programmer and like - he has just so much more knowledge about programming in general - and he's written in so many other languages than I have, and stuff like that. So that's part of it.

But part of it also is just we have really complementary skills too. Our process usually is that one of us write something, and then the other one edits and improves it - and we go back and forth. Like for Type Classes - stuff that we publish on Type Classes, we usually don't have an attribution. So most pieces on Type Classes were written by one or the other of us, and then just edited by the other one.

But for the books, we have to choose an order in which to list the co-authors, right? So the next book that's coming out, he'll be the first author on it, and then I'm going to be co-author. Because my role for that is more going to be the editor and critic of it. That's how we do it. So I wrote Finding Success in Haskell, I wrote it mostly by myself, and then he was the critic that came along and read it, and told me the things that were wrong and the things that were unclear, and the things that maybe needed more examples.

That's our process, and then I go back and edit it and he re-reads it. It's really a fairly simple process. I really like it, because I think it's so easy when you write by yourself to become, to let yourself think that, "I've worked through this, and everything that I've thought of - all the counter-examples that I've thought of, I've dealt with all of those, and so I must be correct, right? I must have thought of everything." And then when you work with even just one other person, you find how many things that you didn't even think of.

Len: It's interesting - you're reminding me of something you spoke about once, about how, if you come up with a mathematical proof but you can't convey it, it's kind of effectively not true.

Because other people need to understand, in order for it to be a true proof, in a sense. There's a really interesting sense in which that's the case. And so the process of writing means - well you're actually, it's about conveying something successfully to other people.

And so you chose Leanpub as the platform for your latest book?

Julie: Yeah.

Len: What was the reason for that?

Julie: It just seemed like a very frictionless way to get it published, and it had the right tools for offering something in early access, and it's very accessible - it's very widely accessible. And certainly in our little niche of the world, in tech self-publishing - I mean everybody's heard of it, and so you're not going to be referring people to some site to buy your book that they've never heard of, and they're like, "I don't know if I can trust their security in taking my payments," and stuff like that. But it was just so - the support for different formats and stuff, was just frictionless and nice.

We thought at first, "We'll give it a try and see how easy it is to first get it uploaded, and get a page made for it. And then if we don't like it, we can always move it somewhere else, right?" But I mean, so far I think we've been really happy with how easy it is to keep it updated and for everybody - we haven't had any complaints with people who've bought it.

My first book was on Gumroad, and we had some problems where - not to talk bad about them, I guess, but we had some problems like where people couldn't get their download, or their download got badly mangled, or something like that. And we haven't had any of that kind of thing on Leanpub. So it's just been a very frictionless experience.

Len: Thanks for sharing that, that's really interesting. I mean, it's not the kind of thing we often hear about directly, so that's very good. And every service - I mean, we don't talk badly about anybody, and every service has their issues.

One of the things that we've - because in particular, Leanpub genetically is about in-progress publishing, and with technology and things that change quickly, one thing we're confident about, is that handling situations where something doesn't work quite right, is actually - we're built for solving that, or resolving that. For example, we make it really easy to get refunds. That's partly because we want people to feel like buying a book online, an ebook, is the equivalent of taking it off the shelf in a bookstore and thumbing through it. And if you don't like it, well you can kind of put it back. But this is not the way that all online bookstores work.

And so one really interesting thing - I just learned this last night. Do you use Haskell to produce your eBook files?

Julie: Oh, yeah.

Len: I've just got to say - one of the pleasures of having such sophisticated authors is that - you're using our bring your own book writing mode, where you don't use any of the tools that we provide for writing a book.

Julie: Right.

Len: You use all of our really sophisticated bookstore features, but you produce your own eBook files. Lots of people have their own very opinionated ways of doing this, and you have a particularly opinionated -

Julie: Yeah. We started that actually when we started writing together. Although our original version was I think more sophisticated - but the intent is to use that with a much longer book. And because one of the problems with tech writing is keeping it updated, and especially, the Haskell compiler changes a lot, and so most of the stuff that we used in this particular book isn't going to change very much. And so we expect it will continue to compile, and all the code will work for some time.

But there's another book that we're writing, and in that one a lot of the stuff that we're writing - it's a lot more up for grabs whether it will continue to compile six months from now. Six months might be an exaggeration, and we want to be able to keep it updated, and so we developed this whole thing that automatically tests all the code in the book, every time we build the book. We took a subset of that, since this one is less complicated and also much shorter, and, yeah the book is built with Haskell and Nix and -

Len: And is this process public? Is it something that other people can find?

Julie: It isn't yet, but we are intending to make it public.

Len: Okay, well please let us know when you do that, because I'm sure our authors, whether they adopt it themselves or not, many of our authors love hearing about how other authors -

Julie: It's one of those things, that I think - I know a lot of people, because I teach - I go around and teach Haskell workshops. Mostly I teach Haskell workshops to people who, I don't think they have the idea that they'll ever become like a full-time Haskell programmer, they're just interested in it and want to know - they're curious. Which i think is great and to be encouraged.

One of the things I've discovered is that a lot of them would like to have some kind of Haskell side project, where they could be using Haskell in some fashion, but not have to be constantly marinating in it.

And I've recommended to a lot of them - there's a static site generator written in Haskell called Hackle [?] that lets you tinker around with Haskell's monads. I think there's so much documentation for this static site generator, and so many people have written blog posts about, "Well I wanted to tweak it to do X." But I think if you play around with it as a side project, you can get really good exposure to Haskell. I'm hoping that our book-building library package - when we get ready to release that, and a couple of the other packages that hopefully we'll be releasing - I hope to give people more opportunity to do that.

Len: Thanks very much for that. I'm sure people will be really interested in seeing it when it's done.

The last question I always like to ask on this podcast, is - if there was one thing we could build for you on Leanpub, or one thing we could fix for you - can you think of anything you would command us to do?

Julie: Oooh. So this just came up today actually. There's a Haskell conference going on right now that we are one of the sponsors of, called ZuriHac, in Zurich. We made a coupon code for the ebook for ZuriHac attendees as part of our sponsorship. But since you can't actually enter a coupon code as far as we can tell, like at checkout or whatever - you have to give people this slightly awkward and long URL. And so I wish that you could just give them just a coupon code, and they could just go buy the book and use the coupon code.

Len: Thank you very much for that. We always love - I mean, the more specific the feedback we get is the better. And so - we used to have coupon codes, and as you're explaining, now what we provide instead is coupon links.

The way that works is, there'll be And then you can create a coupon code. So it could be ZuriHac2019 or something like that. But you do have to provide people with the entire link, in order for them to be able to redeem the coupon.

We used to have coupon codes. There'd be a little box where you'd enter the coupon code. And one of my - my co-founders will get mad at me if I'm misrepresenting this, but as I recall, the reason we switched to links rather than coupon codes is that, if people go to a page and see a coupon code box, they're like, "Well where's the coupon code?" And so they feel cheated if they don't have the coupon code, but someone else does. And so what that basicallyit's a negative experience for the customer, right? Because they're like, "Well, if only I had that coupon code, I could be paying less for this. There's a secret club out there of coupon code-havers, and I'm not one of them."

I believe this is actually one of the reasons that, like, if you listen to podcasts and they're like, "Go to greatcoursesplus/ezraklein," or something like that, that's the reason it's done that way, rather than providing a coupon code box. It's kind of like a secret only for those - you don't you don't want to reveal that there's a secret, to people who don't have the secret, because then they feel kind of cheated or left out.

Julie: Interesting. Coupon code boxes I think are fairly common on like retail sites.

Len: Yeah - I'm not saying it's kind of like a settled thing, because people, if you go to the grocery store - you probably know that, "Oh, if only I didn’t put up that 'no junk mail' sign, I'd have gotten a big thing full of coupons.”

So it's not it's not a settled thing, but our opinion was that we wanted - after having had a coupon code box, we're like, "Yeah let's do the coupon code."

We really appreciate hearing that your expectation was for a coupon code box, it's always good for us to hear.

Julie: And it's really interesting for me to hear the other side of that. So thank you.

Len: Well, thank you very much Julie for being game for questions on all kinds of different things, and for taking the time out of your day to talk to -

Julie: Well this was a really interesting conversation. It don't think it was like any other podcast I've been on. Nobody else has asked me about Heidegger.

Len: I've been doing this for years, and I've been waiting all this time to ask that question. So thanks very much.

And thanks to you and Chris for using Leanpub for your latest book, we really appreciate that.

Julie: Thank you for providing the service. Like I said, it's been a good experience, so far.

Len: Okay, thanks.

And thanks as always to all of you for listening to this episode of the Frontmatter Podcast. If you heard a couple of blips in the audio, you're not crazy - they really were there. But I don't think they really got in the way. If you like what you heard, please rate and review us wherever you found us - particularly on iTunes. And if you'd like to be a Leanpub author, please go to our website at Thanks.

Podcast info & credits
  • Published on July 18th, 2019
  • Interview by Len Epp on June 13th, 2019
  • Transcribed by Alys McDonough