"How types make hard problems easy" (or at least reduce cognitive load over time) (mayhul.com)
from SwordInStone@lemmy.world to programming@programming.dev on 05 Jan 10:42
https://lemmy.world/post/23906621

#programming

threaded - newest

Slotos@feddit.nl on 05 Jan 11:29 next collapse

I can often implement 80% of a new feature without ever running the code.

I really love how they then go and invent their own TDD acronym to justify this. Types are proofs, and they replace a whole category of borderline superficial tests with useful assertions, but claiming that you implement a <random number>% of a feature when you haven’t once verified it is… a reason I regularly cuss at code and remain employable. Keep it up.

SwordInStone@lemmy.world on 05 Jan 12:23 collapse

They probably mean “not running” as “I’ve written the types and the static type checker is not giving an error”

traches@sh.itjust.works on 05 Jan 12:30 next collapse

I’ve tried to use that NonEmptyArray type in the past and it was a real pain in the ass getting the type checker to believe that no, for realsies this array is not empty I just checked the length two lines ago. Is there some trick I don’t know or has it gotten smarter about that in recent updates?

SwordInStone@lemmy.world on 05 Jan 13:33 collapse

Have you actually implemented a custom type guard or just asserted size?

traches@sh.itjust.works on 05 Jan 22:50 collapse

This is what I’m talking about:

<img alt="" src="https://sh.itjust.works/pictrs/image/99f72784-3d7f-4ba7-9b24-a6a163006a2d.png">

Code for copy-pasting:

type NonEmptyArray<T> = [T, ...T[]];

function neverEmpty<T>(array: T[]): NonEmptyArray<T> | null {  
    if (array.length === 0) return null

    return array
}
SwordInStone@lemmy.world on 05 Jan 22:59 collapse

type NonEmptyArray<T> = [T, ...T[]];

function isNonEmptyArray<T>(arr: T[]): arr is NonEmptyArray<T> {
    return arr.length > 0;
}

function neverEmpty<T>(array: T[]): NonEmptyArray<T> | null {  
    if (!isNonEmptyArray(array)) return null

    return array
}
traches@sh.itjust.works on 05 Jan 23:06 collapse

Hey cool, I learned something. Thanks!

tyler@programming.dev on 05 Jan 18:13 next collapse

Article written like it’s someone that just discovered types even though a majority of the programming world said to use types for decades…

Also I completely disagree with the assertion that you should write everything including backend in typescript in order to share types. You should be using a schema and generating your types if you are writing large systems. That way any service that uses your APIs can generate the types as well and isn’t locked in to your language.

And please dear lord stop writing backend code in JavaScript or typescript or any scripting language.

Other than that, yes, use types. They literally do exactly what every proponent of types has said they do for years. Turns out it’s a huge benefit!

bitcrafter@programming.dev on 05 Jan 21:27 collapse

Article written like it’s someone that just discovered types even though a majority of the programming world said to use types for decades…

Yeah, how dare the author discover something that they did not know before and get so excited about it that they wanted to write an article about what they learned! That is a completely inappropriate thing to do with a personal blog.

<img alt="" src="https://programming.dev/pictrs/image/a6c57934-d738-4ffe-b952-6112078a969b.png">


Edit: Finally figured out how to link the image to the original comic. (I needed to embed the image link inside of another link.)

tyler@programming.dev on 06 Jan 05:22 collapse

They mention their company numerous times over, sure doesn’t seem like a personal blog. It seems like a company discovering something that has been documented over and over again.

livingcoder@programming.dev on 06 Jan 17:41 collapse

In Rust, using the Option and Result types make the general flow of the application much easier to organize, make modular, and reuse.