gpt4 book ai didi

typescript - Maybe monad 在 TypeScript 中有何用处?

转载 作者:行者123 更新时间:2023-12-02 01:44:04 29 4
gpt4 key购买 nike

我正在努力理解 TypeScript 中 Maybe 类型的值(value)。我正在尝试理解 this article about implementing your own Maybe type in TypeScript 中的代码示例:

enum MaybeType {
Just = 'maybe-type__just',
Nothing = 'maybe-type__nothing',
}

interface Just<T> {
type: typeof MaybeType.Just
value: T
}

interface Nothing {
type: typeof MaybeType.Nothing
}

type Maybe<T>
= Just<T>
| Nothing

const Nothing = (): Nothing => ({
type: MaybeType.Nothing,
})

const Just = <T> (value: T): Just<T> => ({
type: MaybeType.Just,
value,
})

这实际上有什么用处?我不明白它有什么比 T | 类型更好的地方。未定义

我(非常有限)的理解是 Maybe 类型可以使您免受某些运行时错误的影响,并消除整个代码中对 null/未定义检查的需要。但是,您是否只是用在代码中散布的 undefined 检查来交换在代码中散布的 Nothing 检查?

在此示例中,Nothing 结果没有 value 属性,但 Just 类型有。因此,在没有首先确保结果确实是 Just 的情况下,TypeScript 甚至不会让我访问该值。那么这是否意味着到处都有大量的检查?为什么不继续进行普通的 undefined 检查呢?我正在查看的示例只是 Maybe 类型的蹩脚实现吗?

显然我错过了一些东西,而且还有更多。这个东西是如何工作的以及它有什么用处?

最佳答案

您是正确的,您所包含的代码片段在T | undefined之上提供的有形值(value)非常少。 .

然而,稍后在链接的文章中,作者介绍了其他功能,例如 maybeMap 就是值(value)所在:

function maybeMap<A, B> (f: (val: A) => B, m: Maybe<A>): Maybe<B> {
switch (m.type) {
case MaybeType.Nothing:
return Nothing()
case MaybeType.Just:
return Just(f(m.value))
}
}

考虑这种情况:

type Person = {
name: string;
age: Maybe<number>; // We don't always know their age
}

const bob:Person = {
name: "Bobby Tables",
age: Just(23)
}

现在假设我们有一个具有以下方法的寻人系统:

   function findByName(personName: string): Maybe<Person>

这很好地说明了这样一个事实:我们可能找不到合适的人,但我们仍然没有从 Person | undefined 获得太多值(value)。 .

但现在假设我们需要获取我们找到的人的年龄

因为Maybe<T>是一元的,我们可以组合一些东西,以避免通过检查undefined来避免我们的代码乱七八糟。 :

  function findAgeOfPerson(personName: string): Maybe<number> {
const maybePerson = findByName(personName);
return maybePerson.map((p) => p.age);
}

if陈述,没有真实性检查。

如果maybePersonNothing然后map刚刚返回 Nothing ,但如果不是则 (p) => p.age完全安全地满足我们的需要。

关于typescript - Maybe monad 在 TypeScript 中有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71167632/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com