WEBVTT

1
00:00:00.160 --> 00:00:03.720
<v Speaker 1>So if I told you to design a tool for

2
00:00:03.759 --> 00:00:08.759
<v Speaker 1>a sailor in the seventeen hundreds to prevent a deadly disease,

3
00:00:08.960 --> 00:00:09.759
<v Speaker 1>you'd probably give.

4
00:00:09.640 --> 00:00:12.039
<v Speaker 2>Them a lemon, right, a literal lemon, exactly.

5
00:00:12.400 --> 00:00:14.480
<v Speaker 1>But if I told you to design a tool to

6
00:00:14.599 --> 00:00:18.039
<v Speaker 1>prevent a modern software engineer from completely losing their mind,

7
00:00:18.440 --> 00:00:20.640
<v Speaker 1>you'd give them, well, Haskell.

8
00:00:20.760 --> 00:00:23.199
<v Speaker 2>Which sounds completely absurd on its face.

9
00:00:23.320 --> 00:00:26.199
<v Speaker 1>I know, it really does. I mean, when you hear

10
00:00:26.280 --> 00:00:30.199
<v Speaker 1>the phrase functional programming or you know Haskell, there is

11
00:00:30.280 --> 00:00:33.000
<v Speaker 1>this immediate reflex to just tense up.

12
00:00:33.079 --> 00:00:33.719
<v Speaker 2>Oh totally.

13
00:00:33.759 --> 00:00:36.520
<v Speaker 1>It has this towering reputation, Yeah, like it's the mount

14
00:00:36.560 --> 00:00:40.799
<v Speaker 1>Everest of coding, this hyper academic, mystical language built by

15
00:00:40.920 --> 00:00:42.320
<v Speaker 1>and for math geniuses.

16
00:00:42.320 --> 00:00:44.759
<v Speaker 2>Well what if that reputation is completely backwards?

17
00:00:44.880 --> 00:00:47.719
<v Speaker 1>Right? What is a language supposedly built for these towering

18
00:00:47.759 --> 00:00:52.079
<v Speaker 1>intellects is actually designed like perfectly for our flawed, limited

19
00:00:52.159 --> 00:00:52.840
<v Speaker 1>human brains.

20
00:00:52.920 --> 00:00:54.520
<v Speaker 2>That's exactly what we're looking at today.

21
00:00:54.840 --> 00:00:57.920
<v Speaker 1>Welcome to today's deep dive. Our mission here is to unpack

22
00:00:57.960 --> 00:01:01.840
<v Speaker 1>this notoriously intimidating subject and show you exactly how it's

23
00:01:01.880 --> 00:01:04.000
<v Speaker 1>built to save you from information overload.

24
00:01:04.319 --> 00:01:07.799
<v Speaker 2>And we are pulling from a truly unique source to

25
00:01:07.920 --> 00:01:11.480
<v Speaker 2>do that. We're diving into excerpts from the book Haskell

26
00:01:11.599 --> 00:01:16.159
<v Speaker 2>Programming from First Principles by Christopher Allen and Julie Marnuki.

27
00:01:15.959 --> 00:01:19.239
<v Speaker 1>Which I have to say has gotten some extraordinary praise.

28
00:01:19.040 --> 00:01:22.519
<v Speaker 2>Oh, unbelievable praise. You have reader feedback from people like

29
00:01:22.680 --> 00:01:25.200
<v Speaker 2>Jason Kurt saying you know, there will forever be a

30
00:01:25.239 --> 00:01:27.159
<v Speaker 2>Haskell before and Haskell after.

31
00:01:27.519 --> 00:01:28.519
<v Speaker 1>That's quite the endorsement.

32
00:01:28.719 --> 00:01:31.400
<v Speaker 2>Yeah, And you even have physicist David Deutsch praising it.

33
00:01:31.519 --> 00:01:33.719
<v Speaker 2>He noted that it acts like a really good teacher

34
00:01:33.760 --> 00:01:36.280
<v Speaker 2>who never presume is what you already.

35
00:01:35.920 --> 00:01:39.319
<v Speaker 1>Know, right, so the right information just surfaces precisely when

36
00:01:39.319 --> 00:01:42.200
<v Speaker 1>you need it exactly. And that is the exact tone

37
00:01:42.239 --> 00:01:44.560
<v Speaker 1>we are bringing to you today. You do not need

38
00:01:44.599 --> 00:01:48.040
<v Speaker 1>a computer science degree or a math background to follow along.

39
00:01:47.760 --> 00:01:49.040
<v Speaker 2>With this, not at all.

40
00:01:49.120 --> 00:01:52.920
<v Speaker 1>We are just exploring how complex ideas can be broken

41
00:01:53.000 --> 00:01:57.040
<v Speaker 1>down to protect your cognitive load. And honestly, the story

42
00:01:57.040 --> 00:02:00.359
<v Speaker 1>of how this book even came into existence sets that

43
00:02:00.480 --> 00:02:01.000
<v Speaker 1>up perfectly.

44
00:02:01.239 --> 00:02:03.719
<v Speaker 2>It really does, because it wasn't written by you know,

45
00:02:03.840 --> 00:02:06.640
<v Speaker 2>two Iver Tower professors coding in a basement since the

46
00:02:06.760 --> 00:02:07.599
<v Speaker 2>nineteen seventies.

47
00:02:07.719 --> 00:02:09.759
<v Speaker 1>Right. The authorship dynamic is pretty fascinating.

48
00:02:09.919 --> 00:02:13.400
<v Speaker 2>It explains the accessibility of the entire text. Really so.

49
00:02:13.599 --> 00:02:17.080
<v Speaker 2>Chris Allen was a veteran programmer of like fifteen years.

50
00:02:17.159 --> 00:02:18.039
<v Speaker 1>He knew what he was doing.

51
00:02:18.120 --> 00:02:21.240
<v Speaker 2>Oh yeah, he had worked extensively in languages like Closure

52
00:02:21.319 --> 00:02:24.560
<v Speaker 2>and Python, but he found himself hitting a wall trying

53
00:02:24.560 --> 00:02:26.919
<v Speaker 2>to teach Haskell to beginners.

54
00:02:26.439 --> 00:02:28.439
<v Speaker 1>Which is where Julie comes in exactly.

55
00:02:28.879 --> 00:02:32.199
<v Speaker 2>His co author, Julie Moronuki was a linguist and when

56
00:02:32.240 --> 00:02:36.800
<v Speaker 2>they began this project, she had absolutely zero programming experience wait,

57
00:02:37.039 --> 00:02:39.719
<v Speaker 2>literally none, literally none. She had to learn what a

58
00:02:39.759 --> 00:02:42.919
<v Speaker 2>compiler was, what a side effect was, what a stack

59
00:02:43.039 --> 00:02:46.000
<v Speaker 2>overflow meant, entirely from scratch.

60
00:02:46.240 --> 00:02:49.280
<v Speaker 1>That is wild, but I guess they teamed up because

61
00:02:49.560 --> 00:02:54.599
<v Speaker 1>existing learning materials for Haskell relied almost entirely on analogies

62
00:02:54.639 --> 00:02:56.000
<v Speaker 1>to other programming.

63
00:02:55.639 --> 00:02:58.599
<v Speaker 2>Languages, right, which is a huge barrier. If a tutorial says, oh,

64
00:02:58.639 --> 00:03:00.719
<v Speaker 2>this is just like a Python dictionary and you don't know.

65
00:03:00.719 --> 00:03:02.319
<v Speaker 1>Python, you're just locked out of the garden.

66
00:03:02.479 --> 00:03:06.680
<v Speaker 2>Exactly. So Julie became the ultimate stress tester for the book.

67
00:03:06.800 --> 00:03:08.039
<v Speaker 1>That makes so much sense.

68
00:03:08.159 --> 00:03:11.719
<v Speaker 2>If a concept relied on a faulty analogy or assumed

69
00:03:11.759 --> 00:03:15.360
<v Speaker 2>prior programming knowledge, she flagged it, and they just rebuilt

70
00:03:15.360 --> 00:03:16.840
<v Speaker 2>the explanation from the ground up.

71
00:03:17.039 --> 00:03:19.080
<v Speaker 1>Okay, but I want to play Devil's advocate here for

72
00:03:19.080 --> 00:03:19.520
<v Speaker 1>a second.

73
00:03:19.560 --> 00:03:20.000
<v Speaker 2>Go for it.

74
00:03:20.159 --> 00:03:22.960
<v Speaker 1>If this language is so brilliant and this book proves

75
00:03:22.960 --> 00:03:25.960
<v Speaker 1>it can be made accessible, why does Haskell have this

76
00:03:26.120 --> 00:03:30.800
<v Speaker 1>wild internet rumor that you need a PhD in I

77
00:03:30.800 --> 00:03:34.919
<v Speaker 1>don't know, monodology, Yeah, just to write a simple Hello

78
00:03:35.000 --> 00:03:35.919
<v Speaker 1>World program.

79
00:03:36.120 --> 00:03:37.319
<v Speaker 2>Yeah, that's the big question.

80
00:03:37.479 --> 00:03:39.960
<v Speaker 1>Is it just academic elitism keeping people away?

81
00:03:40.319 --> 00:03:43.120
<v Speaker 2>To understand why the tech industry sometimes shies away from

82
00:03:43.120 --> 00:03:47.159
<v Speaker 2>its best tools, the authors use a really fascinating historical lens.

83
00:03:47.520 --> 00:03:50.400
<v Speaker 2>They actually compare the adoption of programming languages to the

84
00:03:50.439 --> 00:03:51.520
<v Speaker 2>history of scurvy.

85
00:03:51.680 --> 00:03:55.080
<v Speaker 1>Okay, scurvy, the disease that wiped out pirates and sailors.

86
00:03:55.199 --> 00:03:58.159
<v Speaker 2>That's the one between the year's fifteen hundred and eighteen hundred.

87
00:03:58.319 --> 00:04:01.159
<v Speaker 2>Scurvy killed and estimated two two million sailors.

88
00:04:01.319 --> 00:04:03.039
<v Speaker 1>Oh wow, two millions.

89
00:04:03.080 --> 00:04:05.840
<v Speaker 2>Yeah, it was devastating. But the cure citrus was actually

90
00:04:05.879 --> 00:04:08.639
<v Speaker 2>recommended by the Surgeon General of the East India Company

91
00:04:08.680 --> 00:04:10.400
<v Speaker 2>as early as sixteen fourteen.

92
00:04:10.479 --> 00:04:12.599
<v Speaker 1>It's sixteen fourteen, so they know about it way early.

93
00:04:12.919 --> 00:04:13.400
<v Speaker 1>They did.

94
00:04:13.919 --> 00:04:18.160
<v Speaker 2>It worked beautifully. It saved lives. Men stopped losing their

95
00:04:18.199 --> 00:04:19.639
<v Speaker 2>teeth and dying at sea.

96
00:04:19.839 --> 00:04:22.399
<v Speaker 1>Okay, so if it cured the disease and saved the fleets,

97
00:04:22.600 --> 00:04:24.160
<v Speaker 1>why would they ever stop using it?

98
00:04:24.279 --> 00:04:28.319
<v Speaker 2>Well, because they didn't understand the underlying chemical mechanism. They

99
00:04:28.399 --> 00:04:31.560
<v Speaker 2>knew eating lemons worked, but they didn't know why. No,

100
00:04:32.319 --> 00:04:36.040
<v Speaker 2>So decades later, the British Navy switched from lemons to limes.

101
00:04:36.399 --> 00:04:39.160
<v Speaker 2>Limes were cheaper and easier to source from their own colonies.

102
00:04:39.199 --> 00:04:40.519
<v Speaker 1>But limes aren't the same.

103
00:04:40.399 --> 00:04:44.680
<v Speaker 2>Right, Limes have a significantly lower vitamin C content than lemons,

104
00:04:45.040 --> 00:04:48.519
<v Speaker 2>So the scurvy came back. Oh no Yeah, people started

105
00:04:48.600 --> 00:04:52.879
<v Speaker 2>dying again and the cure was essentially forgotten until ascorbic

106
00:04:52.959 --> 00:04:56.360
<v Speaker 2>acid vitamin C was formally discovered in the nineteen thirties.

107
00:04:56.560 --> 00:04:58.680
<v Speaker 1>That is incredible. I mean, human progress isn't just a

108
00:04:58.680 --> 00:05:01.560
<v Speaker 1>straight line going up all It can invent something amazing,

109
00:05:01.800 --> 00:05:04.879
<v Speaker 1>totally misunderstand the mechanism of why it works, and then

110
00:05:05.000 --> 00:05:07.680
<v Speaker 1>just abandon it for an inferior tool because it's i

111
00:05:07.680 --> 00:05:08.839
<v Speaker 1>don't know, cheaper or a trend.

112
00:05:08.879 --> 00:05:12.879
<v Speaker 2>Ear and technological progress in computer science suffers from the

113
00:05:12.920 --> 00:05:17.839
<v Speaker 2>exact same amnesia. The authors compare relying on dynamically typed

114
00:05:17.920 --> 00:05:22.720
<v Speaker 2>languages like Python or JavaScript to navigating the oceans without lemons.

115
00:05:23.199 --> 00:05:24.600
<v Speaker 1>Okay, break that down for me.

116
00:05:24.720 --> 00:05:27.920
<v Speaker 2>So, in a dynamically typed language, the system doesn't strictly

117
00:05:28.040 --> 00:05:30.480
<v Speaker 2>enforce what kind of data is flowing through it. Okay,

118
00:05:30.560 --> 00:05:33.319
<v Speaker 2>that forces the programmer to hold all the metadata, all

119
00:05:33.360 --> 00:05:36.639
<v Speaker 2>the rules about what kind of data goes where inside

120
00:05:36.639 --> 00:05:37.120
<v Speaker 2>their own.

121
00:05:37.000 --> 00:05:41.079
<v Speaker 1>Head, and human working memory is remarkably fragile. I mean,

122
00:05:41.319 --> 00:05:43.560
<v Speaker 1>we can only hold on to maybe four to seven

123
00:05:43.639 --> 00:05:45.319
<v Speaker 1>distinct items at any given.

124
00:05:45.079 --> 00:05:48.199
<v Speaker 2>Time, exactly. So if you force a programmer to remember

125
00:05:48.240 --> 00:05:51.480
<v Speaker 2>that variable x is a string of text, and variable

126
00:05:51.639 --> 00:05:52.839
<v Speaker 2>y is and integer.

127
00:05:52.560 --> 00:05:55.240
<v Speaker 1>And variable z is a list of user IDs.

128
00:05:55.199 --> 00:05:56.639
<v Speaker 2>Right, eventually they just drop a ball.

129
00:05:56.720 --> 00:05:57.839
<v Speaker 1>Yeah, you're gonna mess that up.

130
00:05:57.920 --> 00:06:00.920
<v Speaker 2>Chris actually shares a painful anecdote in the text about

131
00:06:00.920 --> 00:06:05.040
<v Speaker 2>this exact limitation. He once spent over two hours trying

132
00:06:05.079 --> 00:06:07.800
<v Speaker 2>to track down a single type error in a dynamically

133
00:06:07.839 --> 00:06:08.680
<v Speaker 2>typed language.

134
00:06:08.720 --> 00:06:09.920
<v Speaker 1>Two hours for one error.

135
00:06:10.000 --> 00:06:12.240
<v Speaker 2>Yeah, and the entire program was only two hundred and

136
00:06:12.240 --> 00:06:13.000
<v Speaker 2>fifty lines long.

137
00:06:13.079 --> 00:06:14.199
<v Speaker 1>Oh wow, that is nothing.

138
00:06:14.560 --> 00:06:17.800
<v Speaker 2>But because the system allowed malformed data to just keep

139
00:06:17.879 --> 00:06:22.480
<v Speaker 2>flowing downward. The error propagated far away from the original problem.

140
00:06:22.560 --> 00:06:26.120
<v Speaker 1>It's like a disease spreading silently through the code exactly. So,

141
00:06:26.240 --> 00:06:29.720
<v Speaker 1>dynamic typing is like navigating without lemons because we rely

142
00:06:29.800 --> 00:06:32.639
<v Speaker 1>on our own limited brains to track the data types.

143
00:06:33.279 --> 00:06:36.040
<v Speaker 1>How does Haskell actually solve that? What is it? Vitamin C?

144
00:06:36.360 --> 00:06:40.680
<v Speaker 2>Haskell uses strict static typing. The compiler, which is the

145
00:06:40.680 --> 00:06:44.120
<v Speaker 2>program that translates your code into machine language. It acts

146
00:06:44.160 --> 00:06:47.480
<v Speaker 2>as an impenetrable wall before the program is even allowed.

147
00:06:47.160 --> 00:06:49.079
<v Speaker 1>To run, so it checks everything.

148
00:06:48.759 --> 00:06:52.160
<v Speaker 2>First, every single piece of data, against strict roles. If

149
00:06:52.160 --> 00:06:54.319
<v Speaker 2>you try to hand a text string to a math function,

150
00:06:54.680 --> 00:06:57.800
<v Speaker 2>the compiler stops you immediately and says this is inconsistent.

151
00:06:57.959 --> 00:06:59.839
<v Speaker 1>It tracks the metadata so your brain doesn't.

152
00:06:59.600 --> 00:07:02.800
<v Speaker 2>Have to You can refactor or change thousands of lines

153
00:07:02.800 --> 00:07:05.600
<v Speaker 2>of code without fear knowing the compilers doing the heavy

154
00:07:05.639 --> 00:07:07.279
<v Speaker 2>lifting of remembering what everything is.

155
00:07:07.759 --> 00:07:10.959
<v Speaker 1>That brings us to a really crucial pivot, because to

156
00:07:11.000 --> 00:07:14.759
<v Speaker 1>build a tool that can flawlessly protect our working memory,

157
00:07:15.199 --> 00:07:19.959
<v Speaker 1>we need a solid mathematical foundation. And the book doesn't

158
00:07:20.000 --> 00:07:22.839
<v Speaker 1>start by having you type code into a terminal. It

159
00:07:22.879 --> 00:07:25.560
<v Speaker 1>actually takes us back to the nineteen thirties.

160
00:07:25.279 --> 00:07:27.839
<v Speaker 2>Right to a mathematician named Alonzo Church.

161
00:07:28.160 --> 00:07:31.959
<v Speaker 1>Yes, and something called the lambda calculus, which I have

162
00:07:32.040 --> 00:07:34.360
<v Speaker 1>to admit. When I was first reading the sources, lambda

163
00:07:34.399 --> 00:07:36.639
<v Speaker 1>calculus sounded absolutely terrifying.

164
00:07:36.759 --> 00:07:39.160
<v Speaker 2>It sounds like advanced calculus, which scares a lot of.

165
00:07:39.079 --> 00:07:43.000
<v Speaker 1>People, definitely, But as I dug into the actual mechanics

166
00:07:43.000 --> 00:07:46.839
<v Speaker 1>of it, I realized it's really just a system of substitutions.

167
00:07:47.079 --> 00:07:49.319
<v Speaker 1>It reminded me exactly of playing mad lips.

168
00:07:49.439 --> 00:07:51.120
<v Speaker 2>Oh, that's a great way to think about it.

169
00:07:51.199 --> 00:07:53.360
<v Speaker 1>You know those fill in the blank puzzle books where

170
00:07:53.360 --> 00:07:55.000
<v Speaker 1>you ask a friend for a noun and then you

171
00:07:55.040 --> 00:07:57.040
<v Speaker 1>write it into a sentence to make a funny story.

172
00:07:57.319 --> 00:08:00.839
<v Speaker 2>That is a remarkably accurate way to visualize the mechanism.

173
00:08:01.720 --> 00:08:04.399
<v Speaker 2>In Lenda calculus, an abstraction, which is what they call

174
00:08:04.439 --> 00:08:08.879
<v Speaker 2>a function, operates just like a mad Libs sentence. Okay,

175
00:08:08.959 --> 00:08:10.920
<v Speaker 2>the function has a head and a body.

176
00:08:11.160 --> 00:08:13.319
<v Speaker 1>So the head of the lambda function is like the

177
00:08:13.439 --> 00:08:15.879
<v Speaker 1>prompt in mad Libs. Right, it's the blank space that

178
00:08:15.920 --> 00:08:17.560
<v Speaker 1>tells you what kind of word you need. It says,

179
00:08:17.800 --> 00:08:18.639
<v Speaker 1>give me a noun.

180
00:08:19.560 --> 00:08:23.120
<v Speaker 2>That's the parameter, right exactly, and then the body of

181
00:08:23.160 --> 00:08:25.079
<v Speaker 2>the function is the actual sentence you were going to

182
00:08:25.120 --> 00:08:28.879
<v Speaker 2>write that noun into. Building on your analogy, A formal

183
00:08:28.959 --> 00:08:34.320
<v Speaker 2>lambda term relies on three components expressions, variables, and those abstractions.

184
00:08:35.039 --> 00:08:37.279
<v Speaker 2>And a foundational rule of this system is that the

185
00:08:37.360 --> 00:08:40.600
<v Speaker 2>label on that blank space doesn't matter at all.

186
00:08:40.519 --> 00:08:42.840
<v Speaker 1>Meaning it doesn't matter if I ask my friend for

187
00:08:42.960 --> 00:08:46.519
<v Speaker 1>no one noun a or just a describing word, right,

188
00:08:46.600 --> 00:08:48.320
<v Speaker 1>as long as they give me a noun, it goes

189
00:08:48.320 --> 00:08:50.000
<v Speaker 1>into the same blank space in the sentence.

190
00:08:50.320 --> 00:08:53.279
<v Speaker 2>The formal mathematical term for that is alpha equivalents. It

191
00:08:53.320 --> 00:08:56.279
<v Speaker 2>dictates that a function written as say, lambda x dot

192
00:08:56.480 --> 00:08:59.480
<v Speaker 2>x is logically identical to a function written as lambda

193
00:08:59.639 --> 00:08:59.960
<v Speaker 2>y dot com.

194
00:09:00.200 --> 00:09:01.840
<v Speaker 1>Why so letters don't matter.

195
00:09:01.919 --> 00:09:04.519
<v Speaker 2>The letters x and R are just placeholders. They hold

196
00:09:04.559 --> 00:09:07.159
<v Speaker 2>no inherent meaning until you actually apply an argument to them.

197
00:09:07.240 --> 00:09:09.080
<v Speaker 1>Okay, so we have our mad lib sentence, We have

198
00:09:09.080 --> 00:09:10.879
<v Speaker 1>our blank space, and ask my friend for a noun

199
00:09:10.960 --> 00:09:12.559
<v Speaker 1>and they say banana.

200
00:09:12.720 --> 00:09:14.200
<v Speaker 2>Classic mad libs.

201
00:09:13.960 --> 00:09:17.279
<v Speaker 1>Always, I take the word banana, I substitute it into

202
00:09:17.279 --> 00:09:19.320
<v Speaker 1>the blank space in the sentence, and I cross out

203
00:09:19.360 --> 00:09:23.320
<v Speaker 1>the prompt. That mechanical process of substituting and crossing out

204
00:09:23.320 --> 00:09:27.120
<v Speaker 1>the prompt, that's what the text calls beta reduction, right.

205
00:09:27.120 --> 00:09:30.759
<v Speaker 2>Yes, exactly. In beta reduction, you apply a function to

206
00:09:30.799 --> 00:09:34.759
<v Speaker 2>an argument. You take the input expression, substitute it for

207
00:09:34.879 --> 00:09:38.399
<v Speaker 2>all instances of the bound variable inside the body of the.

208
00:09:38.320 --> 00:09:40.039
<v Speaker 1>Function, and then cross out the prompt.

209
00:09:40.039 --> 00:09:43.799
<v Speaker 2>Crucially, yes, you eliminate the head. The head's only purpose

210
00:09:43.879 --> 00:09:46.799
<v Speaker 2>was to bind the variable. Once the substitution is complete,

211
00:09:46.879 --> 00:09:47.879
<v Speaker 2>it just vanishes.

212
00:09:48.240 --> 00:09:50.679
<v Speaker 1>This is a massive light bulb moment for me. If

213
00:09:50.720 --> 00:09:55.799
<v Speaker 1>we strip away the intimidating jargon, evaluation is really just simplification.

214
00:09:55.480 --> 00:09:59.039
<v Speaker 2>It really is. The authors provide a very intuitive mathematical

215
00:09:59.080 --> 00:10:03.320
<v Speaker 2>example to prove this. Consider the expression two thousand divided

216
00:10:03.360 --> 00:10:06.320
<v Speaker 2>by one thousand. Okay, that is a mathematically valid expression,

217
00:10:06.399 --> 00:10:07.840
<v Speaker 2>but it is not fully reduced.

218
00:10:07.919 --> 00:10:09.919
<v Speaker 1>Right Because if someone asked me how many apples I had,

219
00:10:10.000 --> 00:10:12.639
<v Speaker 1>I wouldn't say I have two thousand divided by one

220
00:10:12.679 --> 00:10:13.360
<v Speaker 1>thousand apples.

221
00:10:13.480 --> 00:10:14.519
<v Speaker 2>That would be very weird.

222
00:10:14.960 --> 00:10:16.879
<v Speaker 1>My brain has to do extra work to parse that

223
00:10:16.960 --> 00:10:18.399
<v Speaker 1>I have two apples.

224
00:10:18.759 --> 00:10:22.679
<v Speaker 2>Exactly. The number two is the normal form of that expression.

225
00:10:23.480 --> 00:10:27.039
<v Speaker 2>Beta normal form is achieved when you cannot apply any

226
00:10:27.080 --> 00:10:29.240
<v Speaker 2>more lambdas to arguments.

227
00:10:29.519 --> 00:10:31.240
<v Speaker 1>So you're at the end of the line.

228
00:10:31.000 --> 00:10:34.039
<v Speaker 2>Right, There are no more evaluation steps to take. Nothing

229
00:10:34.080 --> 00:10:37.440
<v Speaker 2>is left to simplify the ultimate goal of any program

230
00:10:37.480 --> 00:10:40.360
<v Speaker 2>in this paradigm is to reach its normal form, where

231
00:10:40.360 --> 00:10:42.399
<v Speaker 2>it is completely evaluated.

232
00:10:42.840 --> 00:10:46.320
<v Speaker 1>In tying this back to our overarching theme, simplifying down

233
00:10:46.399 --> 00:10:49.200
<v Speaker 1>to a normal form is another way to save cognitive load.

234
00:10:49.320 --> 00:10:49.480
<v Speaker 2>Oh.

235
00:10:49.519 --> 00:10:52.519
<v Speaker 1>Absolutely, you aren't forcing the programmer or the machine to

236
00:10:52.600 --> 00:10:55.559
<v Speaker 1>juggle unresolved equations. You distill it down to its most

237
00:10:55.679 --> 00:10:58.919
<v Speaker 1>basic truth. But I guess how does this nineteen thirties

238
00:10:59.000 --> 00:11:01.840
<v Speaker 1>math translate into actual software engineering.

239
00:11:02.039 --> 00:11:05.159
<v Speaker 2>Well, it translates through the concept of pure functions. Because

240
00:11:05.159 --> 00:11:08.240
<v Speaker 2>Haskell is built on lamb to calculus, it relies entirely

241
00:11:08.279 --> 00:11:11.279
<v Speaker 2>on these pure mathematical relations. Okay, there is a quote

242
00:11:11.279 --> 00:11:13.799
<v Speaker 2>from Mike Hammond in the text that captures the essence

243
00:11:13.840 --> 00:11:17.279
<v Speaker 2>of this perfectly. He says, functions are beacons of constancy

244
00:11:17.320 --> 00:11:18.919
<v Speaker 2>in a sea of turmoil.

245
00:11:18.919 --> 00:11:21.200
<v Speaker 1>Beacons of constancy. I like that. But what makes a

246
00:11:21.200 --> 00:11:23.480
<v Speaker 1>function pure or constant in a machine?

247
00:11:23.720 --> 00:11:27.720
<v Speaker 2>It comes down to a property called referential transparency. A

248
00:11:27.799 --> 00:11:31.960
<v Speaker 2>pure function is a strict, unbreakable relation between inputs and outputs,

249
00:11:32.039 --> 00:11:34.879
<v Speaker 2>so it's locked in completely. If a function is called

250
00:11:35.120 --> 00:11:37.399
<v Speaker 2>F and you give it the input, one and it

251
00:11:37.440 --> 00:11:40.960
<v Speaker 2>returns the output A. It must return A every single

252
00:11:41.000 --> 00:11:43.039
<v Speaker 2>time it is evaluated, no matter.

253
00:11:42.759 --> 00:11:44.799
<v Speaker 1>What time of the day the computer is running, no

254
00:11:44.840 --> 00:11:46.320
<v Speaker 1>matter what other apps.

255
00:11:46.039 --> 00:11:48.600
<v Speaker 2>Are open, no matter what is happening on the network. Yes,

256
00:11:48.919 --> 00:11:52.360
<v Speaker 2>if a function returns X on Tuesday and then returns

257
00:11:52.519 --> 00:11:55.879
<v Speaker 2>why on Wednesday for the exact same input, it is

258
00:11:55.919 --> 00:11:58.279
<v Speaker 2>an invalid function in functional programming.

259
00:11:58.440 --> 00:12:00.519
<v Speaker 1>But doesn't that happen a lot in other languages.

260
00:12:00.639 --> 00:12:04.240
<v Speaker 2>It happens all the time in dynamically typed languages, because

261
00:12:04.279 --> 00:12:06.919
<v Speaker 2>a function might secretly rely on a global variable that

262
00:12:07.080 --> 00:12:08.840
<v Speaker 2>changed somewhere else in the system.

263
00:12:09.039 --> 00:12:09.720
<v Speaker 1>Ah, I see.

264
00:12:09.720 --> 00:12:12.159
<v Speaker 2>That is called a side effect. Pure functions have no

265
00:12:12.240 --> 00:12:12.879
<v Speaker 2>side effects.

266
00:12:12.960 --> 00:12:15.799
<v Speaker 1>This is exactly how we prevent the working memory overlow.

267
00:12:15.840 --> 00:12:18.159
<v Speaker 1>We talked about what the scurvy analogy. If you know

268
00:12:18.240 --> 00:12:21.120
<v Speaker 1>for an absolute fact that an input always yields the

269
00:12:21.200 --> 00:12:23.919
<v Speaker 1>exact same output, you don't have to keep a mental

270
00:12:23.919 --> 00:12:26.960
<v Speaker 1>list of exceptions. You don't have to wonder, wait, did

271
00:12:27.000 --> 00:12:29.200
<v Speaker 1>this variable change while I wasn't looking right?

272
00:12:29.240 --> 00:12:32.320
<v Speaker 2>You can trust the bricks you're building with That predictability

273
00:12:32.360 --> 00:12:37.200
<v Speaker 2>allows you to build massive, sprawling software systems out of small, reliable,

274
00:12:37.279 --> 00:12:38.399
<v Speaker 2>independent functions.

275
00:12:38.440 --> 00:12:40.919
<v Speaker 1>You just assemble them like interlocking gears.

276
00:12:40.679 --> 00:12:44.480
<v Speaker 2>Exactly knowing they will never spontaneously change shape or turn

277
00:12:44.480 --> 00:12:45.320
<v Speaker 2>in the wrong direction.

278
00:12:45.519 --> 00:12:48.879
<v Speaker 1>Because these pure functions are perfectly predictable because they never

279
00:12:49.000 --> 00:12:51.879
<v Speaker 1>change based on hidden variables, you don't need to boot

280
00:12:51.960 --> 00:12:54.960
<v Speaker 1>up a massive, complex program just to see if one

281
00:12:55.039 --> 00:12:56.159
<v Speaker 1>tiny piece works.

282
00:12:56.559 --> 00:12:57.039
<v Speaker 2>You don't.

283
00:12:57.320 --> 00:12:59.559
<v Speaker 1>You can just ask the machine to evaluate a single

284
00:12:59.559 --> 00:13:02.960
<v Speaker 1>function in isolation, which brings us to how we actually

285
00:13:02.960 --> 00:13:05.399
<v Speaker 1>sit down and talk to this system on a computer screen.

286
00:13:05.559 --> 00:13:08.759
<v Speaker 2>Right getting to the practical side, the sources introduced two

287
00:13:08.919 --> 00:13:11.600
<v Speaker 2>main ways to interact with Haskell. You can write your

288
00:13:11.679 --> 00:13:14.159
<v Speaker 2>code into permanent source files, or you can use a

289
00:13:14.320 --> 00:13:15.360
<v Speaker 2>r EPL.

290
00:13:15.320 --> 00:13:17.559
<v Speaker 1>R EPL read evil print loop.

291
00:13:17.600 --> 00:13:22.720
<v Speaker 2>Exactly in Askel's case. This interactive environment is called GHCI.

292
00:13:23.360 --> 00:13:25.559
<v Speaker 2>It is a prompt where you type in an expression,

293
00:13:25.879 --> 00:13:29.720
<v Speaker 2>hit enter, and the system instantly reads it, evaluates it

294
00:13:29.759 --> 00:13:32.360
<v Speaker 2>to its normal form, and prints the result back to you.

295
00:13:32.679 --> 00:13:34.840
<v Speaker 1>So it's a laboratory for immediate feedback.

296
00:13:34.879 --> 00:13:35.840
<v Speaker 2>That's a great way to put it.

297
00:13:35.879 --> 00:13:38.919
<v Speaker 1>But the way we type things out, the syntax has

298
00:13:38.960 --> 00:13:41.720
<v Speaker 1>some quirky rules that can really trip up a beginner,

299
00:13:42.000 --> 00:13:44.159
<v Speaker 1>particularly how we order the words and symbols.

300
00:13:44.279 --> 00:13:48.320
<v Speaker 2>Yeah, this raises the distinction between prefix and infix functions.

301
00:13:48.840 --> 00:13:53.519
<v Speaker 2>By default, functions in Haskell use prefixed syntax. The function

302
00:13:53.639 --> 00:13:56.519
<v Speaker 2>name comes first before the arguments. So if you have

303
00:13:56.559 --> 00:13:58.799
<v Speaker 2>a function that triples a number, you type the word

304
00:13:58.799 --> 00:14:00.799
<v Speaker 2>triple a space and then the number.

305
00:14:00.559 --> 00:14:03.480
<v Speaker 1>Two, soly issuing a command in English triple this number

306
00:14:03.480 --> 00:14:04.440
<v Speaker 1>two exactly.

307
00:14:04.840 --> 00:14:08.399
<v Speaker 2>But math operators like the plus sign or the multiplication

308
00:14:08.519 --> 00:14:12.120
<v Speaker 2>sign are actually functions too. They take inputs and return

309
00:14:12.120 --> 00:14:15.480
<v Speaker 2>an output. However, they are infix operators, so they sit.

310
00:14:15.360 --> 00:14:17.600
<v Speaker 1>In the middle of their arguments like one plus one.

311
00:14:17.720 --> 00:14:19.559
<v Speaker 2>Right, which makes sense because that's how we all learn

312
00:14:19.600 --> 00:14:22.080
<v Speaker 2>math in elementary school. But the book points out that

313
00:14:22.120 --> 00:14:25.600
<v Speaker 2>mixing these up introduces strict rules about associativity.

314
00:14:26.000 --> 00:14:28.440
<v Speaker 1>Hold on, if you're listening to this while commuting or

315
00:14:28.480 --> 00:14:31.279
<v Speaker 1>making dinner, your eyes might have just glazed over at

316
00:14:31.320 --> 00:14:34.480
<v Speaker 1>the word associativity. Let's ground this fair point. Why does

317
00:14:34.519 --> 00:14:36.759
<v Speaker 1>a programmer actually need to care if the math goes

318
00:14:36.840 --> 00:14:38.759
<v Speaker 1>left to right or right to left.

319
00:14:38.720 --> 00:14:41.519
<v Speaker 2>Because the computer will follow its rules flawlessly, whether you

320
00:14:41.600 --> 00:14:44.799
<v Speaker 2>intended it to or not, which can lead to wildly

321
00:14:44.840 --> 00:14:45.639
<v Speaker 2>different results.

322
00:14:45.840 --> 00:14:46.679
<v Speaker 1>Give me an example.

323
00:14:46.759 --> 00:14:49.480
<v Speaker 2>Okay, if you type two, three four in into the

324
00:14:49.639 --> 00:14:54.360
<v Speaker 2>r epl, the machine sees two exponent operators. Because exponentiation

325
00:14:54.519 --> 00:14:58.159
<v Speaker 2>associates to the right, it calculates the right most part first,

326
00:14:58.320 --> 00:15:00.840
<v Speaker 2>so three four right, which is e eighty one. Then

327
00:15:00.879 --> 00:15:04.279
<v Speaker 2>it calculates to eighty one, which is an astronomically large number.

328
00:15:04.360 --> 00:15:06.639
<v Speaker 1>Wow. But if you assumed it read left to right

329
00:15:07.159 --> 00:15:09.960
<v Speaker 1>like regular English text, you would expect it to calculate

330
00:15:09.960 --> 00:15:12.440
<v Speaker 1>two three first, which is eight right, and then raise

331
00:15:12.480 --> 00:15:15.279
<v Speaker 1>eight to the fourth power, which is only four ninety

332
00:15:15.320 --> 00:15:16.600
<v Speaker 1>six exactly.

333
00:15:16.639 --> 00:15:19.360
<v Speaker 2>So if your software was calculating a financial interest rate

334
00:15:19.559 --> 00:15:23.080
<v Speaker 2>and you misunderstood the associativity, you just bankrupted the company.

335
00:15:23.159 --> 00:15:26.399
<v Speaker 1>Yikes. A perfect example of why I understand the strict

336
00:15:26.480 --> 00:15:29.320
<v Speaker 1>rules of the language prevents catastrophic failure.

337
00:15:29.480 --> 00:15:32.919
<v Speaker 2>Yeah, and the book dives into another concrete mathematical example

338
00:15:32.919 --> 00:15:36.960
<v Speaker 2>that illustrates this beautifully, the modulo clock using the mod

339
00:15:37.080 --> 00:15:38.120
<v Speaker 2>and REM functions.

340
00:15:38.320 --> 00:15:40.639
<v Speaker 1>Both of those deal with division, but mod stands for

341
00:15:40.759 --> 00:15:43.960
<v Speaker 1>modulo and REM stands for a remainder. Walk me through

342
00:15:44.080 --> 00:15:46.159
<v Speaker 1>modular arithmetic using a standard clock.

343
00:15:46.320 --> 00:15:49.120
<v Speaker 2>Sure, look at a standard twelve hour analog clock.

344
00:15:49.320 --> 00:15:49.600
<v Speaker 1>Yeah.

345
00:15:49.639 --> 00:15:52.000
<v Speaker 2>If the current time is eight zero zero and you

346
00:15:52.080 --> 00:15:53.919
<v Speaker 2>need to know what time it will be in eight hours,

347
00:15:54.279 --> 00:15:56.279
<v Speaker 2>you don't add eight plus a and declare it will

348
00:15:56.320 --> 00:15:57.159
<v Speaker 2>be sixteen o'clock.

349
00:15:57.440 --> 00:16:01.240
<v Speaker 1>Obviously not on a twelve hour dial. The numbers wrap

350
00:16:01.279 --> 00:16:04.200
<v Speaker 1>around the modulus, which is twelve, So you add four

351
00:16:04.240 --> 00:16:07.519
<v Speaker 1>hours to reach twelve zero zero. The dial resets to

352
00:16:07.600 --> 00:16:10.279
<v Speaker 1>zero and you add the remaining four hours. So eight

353
00:16:10.320 --> 00:16:12.960
<v Speaker 1>hours after eight zero zero is four point zero.

354
00:16:13.120 --> 00:16:16.879
<v Speaker 2>That is arithmetic modulu twelve. Haskell actually includes two different

355
00:16:16.919 --> 00:16:19.120
<v Speaker 2>functions for this, mod and REM, and they usually the

356
00:16:19.159 --> 00:16:23.399
<v Speaker 2>exact same answer, usually, but they diverge in behavior when

357
00:16:23.399 --> 00:16:27.799
<v Speaker 2>you introduce negative numbers. If one argument is negative, mod

358
00:16:28.000 --> 00:16:30.120
<v Speaker 2>takes the sign of the divisor the number you are

359
00:16:30.120 --> 00:16:32.759
<v Speaker 2>dividing by, okay, but REM takes the sign of the

360
00:16:32.759 --> 00:16:34.360
<v Speaker 2>dividend the number being divided.

361
00:16:34.440 --> 00:16:36.360
<v Speaker 1>Okay. Let's put this in a real world scenario so

362
00:16:36.399 --> 00:16:38.879
<v Speaker 1>we understand why this matters. Let's say you are building

363
00:16:38.919 --> 00:16:39.960
<v Speaker 1>a calendar application.

364
00:16:40.080 --> 00:16:41.360
<v Speaker 2>Okay, a calendar app.

365
00:16:41.360 --> 00:16:43.960
<v Speaker 1>Days of the week loop every seven days, so your

366
00:16:44.000 --> 00:16:48.440
<v Speaker 1>modulus is seven. Tuesday is day two. A user wants

367
00:16:48.480 --> 00:16:50.720
<v Speaker 1>to search for an event that happened ten days ago.

368
00:16:51.159 --> 00:16:54.159
<v Speaker 1>You subtract ten from two, which gives you negative eight.

369
00:16:54.759 --> 00:16:57.000
<v Speaker 2>Right, and if you use the REM function to divide

370
00:16:57.039 --> 00:16:59.600
<v Speaker 2>negative eight by seven, the remainder takes the sign of

371
00:16:59.600 --> 00:17:02.080
<v Speaker 2>the negative of eight. It returns in negative.

372
00:17:01.759 --> 00:17:03.960
<v Speaker 1>One, but there is no negative first day of the week.

373
00:17:04.000 --> 00:17:05.960
<v Speaker 1>The calendar application completely.

374
00:17:05.519 --> 00:17:08.480
<v Speaker 2>Breaks exactly, but if you use the mod function, it

375
00:17:08.559 --> 00:17:11.720
<v Speaker 2>correctly wraps around the negative value and returns a positive six,

376
00:17:11.759 --> 00:17:13.119
<v Speaker 2>which corresponds to Saturday.

377
00:17:13.240 --> 00:17:13.640
<v Speaker 1>Wow.

378
00:17:14.039 --> 00:17:17.720
<v Speaker 2>Knowing that subtle distinction prevents massive bugs when you are

379
00:17:17.720 --> 00:17:21.480
<v Speaker 2>dealing with wrapped values like times, dates, or even graphical

380
00:17:21.559 --> 00:17:22.480
<v Speaker 2>user interfaces.

381
00:17:22.839 --> 00:17:25.960
<v Speaker 1>But thinking about typing all of this outkeeping track of

382
00:17:26.519 --> 00:17:31.319
<v Speaker 1>prefix infix associativity whether a value might be negative, I mean,

383
00:17:31.440 --> 00:17:34.599
<v Speaker 1>it feels like the code could become incredibly dense and

384
00:17:34.759 --> 00:17:36.400
<v Speaker 1>visually overwhelming to read.

385
00:17:37.000 --> 00:17:40.519
<v Speaker 2>It could, which is why programming languages utilize something called

386
00:17:40.599 --> 00:17:41.680
<v Speaker 2>syntactic sugar.

387
00:17:42.079 --> 00:17:47.000
<v Speaker 1>Syntactic sugar beyond sounding delicious, what is the actual mechanism here?

388
00:17:47.200 --> 00:17:50.559
<v Speaker 2>Syntactic sugar is a feature of a programming language's grammar

389
00:17:50.640 --> 00:17:53.400
<v Speaker 2>designed strictly to make things easier for humans to read

390
00:17:53.440 --> 00:17:56.119
<v Speaker 2>and write. Oh nice, Yeah, It does not change the

391
00:17:56.200 --> 00:18:00.000
<v Speaker 2>underlying semantics or the lambda calculus math at all. For example,

392
00:18:00.000 --> 00:18:03.279
<v Speaker 2>simple to make a number negative in Haskell, the formal

393
00:18:03.359 --> 00:18:06.599
<v Speaker 2>mechanism is to apply a function called negate to it,

394
00:18:06.880 --> 00:18:07.480
<v Speaker 2>so you'd.

395
00:18:07.240 --> 00:18:09.000
<v Speaker 1>Have to type the word negate, add a space, and

396
00:18:09.039 --> 00:18:10.319
<v Speaker 1>tack the number nine right.

397
00:18:10.559 --> 00:18:13.400
<v Speaker 2>But seeing the word negate everywhere clutters the screen, So

398
00:18:13.519 --> 00:18:15.440
<v Speaker 2>Haskell allows you to just type negative nine.

399
00:18:15.559 --> 00:18:18.839
<v Speaker 1>Ah. So behind the scenes, the compiler is still translating

400
00:18:18.839 --> 00:18:22.279
<v Speaker 1>that little dash into the formal negate function. Hmm, but

401
00:18:22.319 --> 00:18:24.799
<v Speaker 1>I don't have to look at the clunky word exactly.

402
00:18:25.039 --> 00:18:28.279
<v Speaker 2>Syntactic sugar is a transformation performed by the compiler after

403
00:18:28.279 --> 00:18:30.680
<v Speaker 2>the code is parsed. It allows you to write code

404
00:18:30.720 --> 00:18:35.359
<v Speaker 2>that looks like natural math without sacrificing the strict underlying logic.

405
00:18:35.519 --> 00:18:37.799
<v Speaker 1>And linking this right back to where we started, Syntactic

406
00:18:37.839 --> 00:18:41.039
<v Speaker 1>sugar isn't just about making the code look pretty visual

407
00:18:41.039 --> 00:18:43.440
<v Speaker 1>Clutter takes cognitive energy to parse.

408
00:18:43.720 --> 00:18:44.759
<v Speaker 2>It absolutely does.

409
00:18:44.920 --> 00:18:47.599
<v Speaker 1>By reducing the noise on the screen, the language is

410
00:18:47.640 --> 00:18:51.000
<v Speaker 1>actively protecting your working memory, making it easier for your

411
00:18:51.079 --> 00:18:54.480
<v Speaker 1>limited monkey brain to spot actual logic errors.

412
00:18:54.640 --> 00:18:57.759
<v Speaker 2>Everything in Haskell, from the strict types acting as your

413
00:18:57.759 --> 00:19:01.119
<v Speaker 2>scurvy lemons, to the simplification of lamb to calculus, to

414
00:19:01.200 --> 00:19:06.160
<v Speaker 2>the pure functions and syntactic sugar, is engineered to reduce cognitive.

415
00:19:05.759 --> 00:19:08.319
<v Speaker 1>Load zooming out. The journey we just took you on

416
00:19:08.400 --> 00:19:12.119
<v Speaker 1>covers massive ground. We started with the realization that software

417
00:19:12.119 --> 00:19:16.039
<v Speaker 1>engineering needs strict rules because human memory is deeply flowed,

418
00:19:16.160 --> 00:19:18.839
<v Speaker 1>very flawed. We travel back to the nineteen thirties with

419
00:19:18.880 --> 00:19:21.920
<v Speaker 1>the Lonzo Church to understand that evaluation is simply the

420
00:19:21.960 --> 00:19:24.839
<v Speaker 1>process of reducing a function down to its normal form.

421
00:19:25.119 --> 00:19:29.000
<v Speaker 1>We saw how referential transparency gives us predictable tools that

422
00:19:29.039 --> 00:19:32.240
<v Speaker 1>don't secretly change behavior based on hidden variables.

423
00:19:32.440 --> 00:19:35.160
<v Speaker 2>And we arrived at the practical mechanics of interacting with

424
00:19:35.200 --> 00:19:40.319
<v Speaker 2>the language, understanding that concepts like associativity and modular arithmetic

425
00:19:40.640 --> 00:19:42.559
<v Speaker 2>aren't just academic trivia.

426
00:19:42.640 --> 00:19:43.599
<v Speaker 1>No, they really aren't.

427
00:19:43.640 --> 00:19:47.400
<v Speaker 2>They are the actual mechanisms that keep complex systems from collapsing.

428
00:19:47.599 --> 00:19:51.319
<v Speaker 1>It is a profoundly beautiful system when you realize every

429
00:19:51.400 --> 00:19:55.359
<v Speaker 1>scary sounding mathematical term is just a guardrail design to

430
00:19:55.440 --> 00:19:56.319
<v Speaker 1>keep you safe.

431
00:19:56.480 --> 00:19:59.480
<v Speaker 2>It is, But you know. There is one final concept

432
00:19:59.480 --> 00:20:02.720
<v Speaker 2>from the Lamb to Calculus text that has fascinating implications

433
00:20:02.759 --> 00:20:06.640
<v Speaker 2>far beyond writing code. What it is the concept of divergence.

434
00:20:07.160 --> 00:20:10.279
<v Speaker 2>In lambda calculus, an expression is supposed to converge down

435
00:20:10.319 --> 00:20:12.839
<v Speaker 2>to a normal form. You simplify it until.

436
00:20:12.599 --> 00:20:14.960
<v Speaker 1>The work is done right like the two apples.

437
00:20:14.640 --> 00:20:19.839
<v Speaker 2>Exactly, but sometimes an expression diverges the substitutions loop endlessly

438
00:20:19.960 --> 00:20:23.839
<v Speaker 2>applying functions over and over without ever terminating or reaching

439
00:20:23.839 --> 00:20:27.119
<v Speaker 2>a simplified meaningful answer. Wow, the system just spins in

440
00:20:27.119 --> 00:20:27.720
<v Speaker 2>a loop.

441
00:20:27.519 --> 00:20:30.319
<v Speaker 1>Forever, endless motion, without ever producing a result.

442
00:20:30.599 --> 00:20:33.480
<v Speaker 2>Exactly. So we want to leave you with this thought

443
00:20:33.720 --> 00:20:36.200
<v Speaker 2>to mull over. Based on the source material, look at

444
00:20:36.200 --> 00:20:40.079
<v Speaker 2>your own daily routines, your habits, your information consumption. How

445
00:20:40.160 --> 00:20:43.599
<v Speaker 2>much of your day is spent in divergence looping endlessly

446
00:20:43.640 --> 00:20:47.519
<v Speaker 2>through tasks, scrolling through feeds, spinning your wheels without ever

447
00:20:47.559 --> 00:20:50.200
<v Speaker 2>reaching a simplified, meaningful normal form.

448
00:20:50.359 --> 00:20:51.400
<v Speaker 1>That's a powerful question.

449
00:20:51.640 --> 00:20:54.000
<v Speaker 2>What would it look like to beta reduce Stron life
