Update boolean values article to new math delimiters

Signed-off-by: Danila Fedorin <danila.fedorin@gmail.com>
This commit is contained in:
Danila Fedorin 2024-05-13 18:54:11 -07:00
parent ffda1d3235
commit e543904995

View File

@ -48,7 +48,7 @@ _expression_ in a programming language (like those in the form `fact(n)`)
or a value in that same programming language (like `5`). or a value in that same programming language (like `5`).
Dealing with values is rather simple. Most languages have finite numbers, Dealing with values is rather simple. Most languages have finite numbers,
usually with \\(2^{32}\\) values, which have type `int`, usually with \(2^{32}\) values, which have type `int`,
`i32`, or something in a similar vein. Most languages also have `i32`, or something in a similar vein. Most languages also have
strings, of which there are as many as you have memory to contain, strings, of which there are as many as you have memory to contain,
and which have the type `string`, `String`, or occasionally and which have the type `string`, `String`, or occasionally
@ -129,20 +129,20 @@ terminate; that is the [halting problem](https://en.wikipedia.org/wiki/Halting_p
So, what do we do? So, what do we do?
It turns out to be convenient -- formally -- to treat the result of a diverging computation It turns out to be convenient -- formally -- to treat the result of a diverging computation
as its own value. This value is usually called 'bottom', and written as \\(\\bot\\). as its own value. This value is usually called 'bottom', and written as \(\bot\).
Since in most programming languages, you can write a nonterminating expression or Since in most programming languages, you can write a nonterminating expression or
function of any type, this 'bottom' is included in _all_ types. So in fact, the function of any type, this 'bottom' is included in _all_ types. So in fact, the
possible values of `unsigned int` are \\(\\bot, 0, 1, 2, ...\\) and so on. possible values of `unsigned int` are \(\bot, 0, 1, 2, ...\) and so on.
As you may have by now guessed, the same is true for a boolean: we have \\(\\bot\\), `true`, and `false`. As you may have by now guessed, the same is true for a boolean: we have \(\bot\), `true`, and `false`.
### Haskell and Bottom ### Haskell and Bottom
You may be thinking: You may be thinking:
> Now he's done it; he's gone off the deep end with all that programming language > Now he's done it; he's gone off the deep end with all that programming language
theory. Tell me, Daniel, where the heck have you ever encountered \\(\\bot\\) in theory. Tell me, Daniel, where the heck have you ever encountered \(\bot\) in
code? This question was for a software engineering interview, after all! code? This question was for a software engineering interview, after all!
You're right; I haven't _specifically_ seen the symbol \\(\\bot\\) in my time You're right; I haven't _specifically_ seen the symbol \(\bot\) in my time
programming. But I have frequently used an equivalent notation for the same idea: programming. But I have frequently used an equivalent notation for the same idea:
`undefined`. In fact, here's a possible definition of `undefined` in Haskell: `undefined`. In fact, here's a possible definition of `undefined` in Haskell:
@ -152,8 +152,8 @@ undefined = undefined
Just like `meaningOfLife`, this is a divergent computation! What's more is that Just like `meaningOfLife`, this is a divergent computation! What's more is that
the type of this computation is, in Haskell, `a`. More explicitly -- and retreating the type of this computation is, in Haskell, `a`. More explicitly -- and retreating
to more mathematical notation -- we can write this type as: \\(\\forall \\alpha . \\alpha\\). to more mathematical notation -- we can write this type as: \(\forall \alpha . \alpha\).
That is, for any type \\(\\alpha\\), `undefined` has that type! This means That is, for any type \(\alpha\), `undefined` has that type! This means
`undefined` can take on _any_ type, and so, we can write: `undefined` can take on _any_ type, and so, we can write:
```Haskell ```Haskell
@ -187,7 +187,7 @@ expression. What you're doing is a kind of academic autofellatio.
Alright, I can accept this criticism. Perhaps just calling a nonterminating Alright, I can accept this criticism. Perhaps just calling a nonterminating
function a value _is_ far-fetched (even though in [denotational semantics](https://en.wikipedia.org/wiki/Denotational_semantics) function a value _is_ far-fetched (even though in [denotational semantics](https://en.wikipedia.org/wiki/Denotational_semantics)
we _do_ extend types with \\(\\bot\\)). But denotational semantics are not we _do_ extend types with \(\bot\)). But denotational semantics are not
the only place where types are implicitly extend with an extra value; the only place where types are implicitly extend with an extra value;
let's look at Java. let's look at Java.
@ -294,7 +294,7 @@ question. Its purpose can be one of two things:
* The interviewer expected a long-form response such as this one. * The interviewer expected a long-form response such as this one.
This is a weird expectation for a software engineering candidate - This is a weird expectation for a software engineering candidate -
how does knowing about \\(\\bot\\), `undefined`, or `null` help in how does knowing about \(\bot\), `undefined`, or `null` help in
creating software, especially if this information is irrelevant creating software, especially if this information is irrelevant
to the company's language of choice? to the company's language of choice?
* The interviewer expected the simple answer. In that case, * The interviewer expected the simple answer. In that case,