- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力理解 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
陈述,没有真实性检查。
如果maybePerson
是 Nothing
然后map
刚刚返回 Nothing
,但如果不是则 (p) => p.age
完全安全地满足我们的需要。
关于typescript - Maybe monad 在 TypeScript 中有何用处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71167632/
我有一个使用 HsOpenSsl 的 readPrivateKey 函数读取 Rsa key 的函数,不幸的是,我的函数的签名是这个 String -> IO (Maybe (IO Maybe Rsa
我有一个类型 data Foo = Foo { bar :: Bar, baz :: Baz } 我正在尝试解析文件以构造 Foo .我有函数可以尝试解析 Bar和 Baz成员(member) par
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我有一个可能的列表和一个给我节点颜色的函数(如果存在): maybeNeighbors :: [Maybe Node] nodeColor :: Node -> Maybe Color 现在
我想有一个类型的函数: f :: [Maybe a] -> Maybe [a] 例如 f [Just 3, Just 5] == Just [3, 5] f [Just 3, Nothing] ==
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
我有一个类型为 Integral => a -> a -> Maybe a 的函数 f。这意味着 f 1 2 是有效的代码,但是自然的组合,例如 f (f 3 4) 5 f 6 (f 7 8) f (
我刚开始学习 Haskell,我发现自己正在为家庭作业编写这段代码: eval :: ExprT -> Integer eval (Lit x) = x eval (Add x y) = (e
是否可以轻松(无需重新发明轮子)从 (Maybe a, b) 转换至 Maybe (a,b) .我看了Traversable但不能让它工作。 最佳答案 您也可以使用 Bitraversable : b
我正在处理一个库( ghcjs-dom ),其中每个函数都返回一个 IO (Maybe T) . 我有一个函数a with 返回 IO (Maybe x)和功能 b需要x作为参数并返回 IO (May
我想计算列表的两个 elemIndex 值的差值。 colours = ["blue", "red", "green", "yellow"] ib = elemIndex "blue" colours
有一个标准tryPick如果 F# 返回第一个(从左到右,如果有的话)函数在列表元素上成功应用的函数。我希望在 Haskell 中有一个像这样的标准函数。我 tried胡歌,没有找到任何东西。 我是
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
我想将以下回调代码包装到 Maybe public class FooDataSource ... public Maybe get(){ return Maybe.create(emitte
我想将 Gen (Maybe Int) 转换为 Maybe Int。我有一个生成 1 到 9 之间的随机 Just Int 的函数。我想使用单元格函数,但我无法更改其类型签名中的任何内容。有什么建议吗
这可能是一件简单的事情,但我正在编写一个想要返回记录的函数,并且其中几个字段需要执行可能失败的操作,所以现在结果记录看起来像这样(假设它是类型别名为 MyRecord)。 { field1 : May
为什么流程会在这里抛出错误? type MaybeProp = { prop: ?number, } type DefinetlyProp = { prop: number, } const
我想建立一个 Repository返回 Single 的类. 该类应首先查看 Cache返回 Maybe如果 Maybe完成转到我的Service返回 Single interface Cache {
使用 Typescipt 4.x.x 我写了一些代码来实现其他语言 Elm/Rust/Haskell 中常用的 Maybe/Option 类型。 我想写一个可以接受映射类型的通用函数 type MyM
在 Elm 中,将 List (Maybe a) 转换为 Maybe (List a) 的好方法是什么? 逻辑很简单: 如果所有项都是Just a,则返回Just (List a) 否则,返回Noth
我是一名优秀的程序员,十分优秀!