我有一些模块级状态,我想写一次,然后再也不修改。
具体来说,我有一组字符串,我想稍后用来查找内容。这样做的有效和普通方法是什么?
我可以创建一个始终返回相同集合的函数:
my_set() -> sets:from_list(["a", "b", "c"]).
Run Code Online (Sandbox Code Playgroud)
VM 会对此进行优化,还是每次都会重新运行构建集合的代码?我怀疑该集合只会获得 GCd。
在这种情况下,我是否应该将集合缓存在进程字典中,以模块 md5 之类的独特内容为键?
Key = proplists:get_value(md5, module_info()), put(Key, my_set())
另一种解决方案是让调用者调用一个init函数来取回一个不透明的状态块,然后将该状态传递给模块中的每个函数。
据我所知,Deno 总是在启动时将 TypeScript 编译为 JS,并且没有“监视”模式。据我了解,除了 TS 监视模式之外,TypeScript 不存在“增量编译”之类的东西。所以,如果想要快速编译TS,就必须使用watch模式。
所以我希望 Deno 有观看模式。但事实并非如此。那么 Deno 的 TS 编译速度如何?
注意:我知道 Deno 使用 tsc 的 V8 快照,以便 tsc 启动很快,但对于大型 TS 项目,tsc 的启动时间与实际编译时间相比会相形见绌。所以我不是在问 V8 快照,而是在问 Deno 使用了哪些其他技巧。它使用构建守护进程吗?
为了了解 TS 生态系统,我正在寻找类型级 TS 库的示例。
通过“类型级 TS 库”,我的意思是类似于 npm 包,它不为特定的值级库提供类型,而是为类型级编程提供工具。
这种事情的一些例子:
还有哪些类型级 TS 库的例子?
这是一个客观的问题,我真的想学习一些东西。我不是在要求“好”与“坏”,只是举例。
OCaml 两者都有不同的语法:
\n+.。3.。# 3 + 3;;\n- : int = 6\n# 3. +. 3.;;\n- : float = 6.\n# 3. + 3;;\nError: This expression has type float but an expression was expected of type\n int\nRun Code Online (Sandbox Code Playgroud)\n我可以看到使用其中一种机制来消除歧义,但为什么总是需要两个? \n例如,我可以看到有时在文字末尾需要的情况,但不是为什么.OCaml可以弄清楚的地方需要它我们想要浮点运算,因为我们说我们想要浮点运算。3 +. 3
我正在寻找基于与其他语言功能交互的具体技术理由\xe2\x80\x93,而不是来自人体工程学的意见或论点。
\n我写了很多使用穷举检查的代码。
在下面的代码中,_exhaustivenessCheck如果有人添加到UnitOfTime联合中,带有will(故意)的行会出现类型错误。我喜欢这种编程风格,但是当结合代码覆盖率和强大的 linter 时,它变得很痛苦:
function waterFrequencyToMilliseconds(unitOfTime: UnitOfTime): number {
switch (unitOfTime) {
case 'days':
return number * ONE_DAY;
case 'weeks':
return number * ONE_WEEK;
}
/* istanbul ignore next */
// eslint-disable-next-line
const _exhaustivenessCheck: never = unitOfTime;
}
Run Code Online (Sandbox Code Playgroud)
我需要告诉伊斯坦布尔和 eslint 在我做正确的事情时让我一个人呆着。
有没有一种标准的方法来处理这种情况,而不必添加“忽略”和“禁用”注释或完全关闭 lint 规则或代码覆盖率?
我发现自己写了很多这样的代码:
thing match {
case Case1 ...
case Case2 ...
case _ => throw new IllegalStateException(s"unexpected $thing")
}
Run Code Online (Sandbox Code Playgroud)
有时,当案例不匹配时,我想要一个运行时错误。案例是一种形式的断言。
有没有更好的方法来抑制穷举检查?
我不想使用,[@unchecked](https://www.scala-lang.org/api/2.12.1/scala/unchecked.html)因为这也会禁用可达性检查,这是我想要的。
type (_, _) eq = Equal: ('a, 'a) eq(来源)有什么用?我已经refl在 Coq 中使用过,但还不需要像 OCaml 中那样的东西。
该类型已在即将发布的 OCaml Stdlib 版本中定义Base,并且.
我如何知道何时使用此类型,以及使用此类型的代码是什么样的?
基地文档说:
Type_equal 的目的是表示类型检查器不知道的类型相等性,否则可能是因为类型相等性取决于动态数据,或者可能是因为类型系统不够强大。
所以听起来我正在寻找类型相等性依赖于动态数据或类型系统不够强大的示例,而类型equal是有帮助的。
我发现使用了
equal具有相同定义的类型,Stdlib.camlinternalFormat但不理解它
更新上面的基本文档中的引用可能不是具体eq的,并且可能与Base.Type_equal.Idiuc 更相关。
此类型检查在TypeScript Playground 中,但在 v3.1.6 上失败:
function head([a]) {
return a;
}
const x: number[] = [[1], [2]].map(head)
Run Code Online (Sandbox Code Playgroud)
错误信息:
server/src/mock-resolvers/mock-data.ts(549,36): error TS2345: Argument of type '([a]: [any]) => any' is not assignable to parameter of type '(value: number[], index: number, array: number[][]) => any'.
Types of parameters '__0' and 'value' are incompatible.
Type 'number[]' is not assignable to type '[any]'.
Property '0' is missing in type 'number[]'.
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?我不明白错误信息,也不明白代码有什么问题。
更具体的类型无济于事,如果函数定义如下,我会收到类似的错误:
function head([a, _b]: [number, number]): number {
return a;
}
Run Code Online (Sandbox Code Playgroud) 我假设 V8 使用散列以便将对象用作Maps 中的键。
const a = {};
new Map([[a, "a"]]);
Run Code Online (Sandbox Code Playgroud)
问题第 1 部分:V8 如何实现具有原始值键的映射,例如以下内容?
const a = {};
new Map([[a, "a"], [1, 100], [2, 200])
Run Code Online (Sandbox Code Playgroud)
问题第 2 部分:
像这样一个只包含原始值键的映射怎么样,这些键都是相同的类型?
new Map([[0, 0], [1, 100], [2, 200])
我所知道的将数字映射到数字的最有效方法是使用向量,这样上面的映射就可以像这样实现:
[0, 100, 200]
V8 是否在这些方面进行了任何专业化处理?
我进行了基准测试,将 Map 与一组数字进行比较,发现 number[] 快了 37%(大致符合预期),但我不确定到底发生了什么:https : //jsperf.com/map-number-number-与阵列。
请注意,在基准测试中,数组和映射是动态构建的,而不是像上面的示例那样一次性构建。
我想复制冻结数据类的实例,仅更改一个字段(“功能更新”)。
这是我尝试过的
from dataclasses import dataclass, asdict
@dataclass(frozen = True)
class Pos:
start: int
end: int
def adjust_start(pos: Pos, delta: int) -> Pos:
# TypeError: type object got multiple values for keyword argument 'start'
return Pos(**asdict(pos), start = pos.start + delta)
adjust_start(Pos(1, 2), 4)
Run Code Online (Sandbox Code Playgroud)
我正在寻找什么:
dicts 转换更直接的方法?TypeError:如果有一种方法可以在功能上更新 kwargs,那么这是可行的。在 Scala 中,案例类(Scala 数据类)的功能更新可以这样完成pos.copy(start = pos.start + delta):