Nim 支持类型推断吗?
Does Nim support type inference?
我在 Nim 中看到了这个例子,它需要 int
和 bool
的显式类型规范,尽管有足够的信息来推断两者(就像 TypeScript 会做的那样)。
如果删除这些类型,它将无法编译,Nim 是否支持类型推断?
import sequtils
let list = @[1, 2, 4]
echo list.filter do (x: int) -> bool: x > 2
Does Nim support type inference?
根据 the Homepage,Nim 有一个……
Modern type system with local type inference, tuples, generics and sum types.
[粗体强调我的]
此外,the language manual 在大约 10 个不同的地方提到了类型推断。
并且 Comparison table on the Nim for TypeScript Programmers Wiki page 将类型推断列为一项功能。
所以,总的来说,答案是 "Yes",至少根据官方文档是这样。
来自手册:
The auto type can only be used for return types and parameters. For return types it causes the compiler to infer the type from the routine body:
你想要的是 sugar 模块中的 =>
宏。
echo list.filter(x => x > 2)
来自文档:
匿名过程的语法糖。
macro `=>`(p, b: untyped): untyped
proc passTwoAndTwo(f: (int, int) -> int): int =
f(2, 2)
passTwoAndTwo((x, y) => x + y) # 4
过程类型的语法糖。
macro `->`(p, b: untyped): untyped
proc pass2(f: (float, float) -> float): float =
f(2, 2)
# is the same as:
proc pass2(f: proc (x, y: float): float): float =
f(2, 2)
我在 Nim 中看到了这个例子,它需要 int
和 bool
的显式类型规范,尽管有足够的信息来推断两者(就像 TypeScript 会做的那样)。
如果删除这些类型,它将无法编译,Nim 是否支持类型推断?
import sequtils
let list = @[1, 2, 4]
echo list.filter do (x: int) -> bool: x > 2
Does Nim support type inference?
根据 the Homepage,Nim 有一个……
Modern type system with local type inference, tuples, generics and sum types.
[粗体强调我的]
此外,the language manual 在大约 10 个不同的地方提到了类型推断。
并且 Comparison table on the Nim for TypeScript Programmers Wiki page 将类型推断列为一项功能。
所以,总的来说,答案是 "Yes",至少根据官方文档是这样。
来自手册:
The auto type can only be used for return types and parameters. For return types it causes the compiler to infer the type from the routine body:
你想要的是 sugar 模块中的 =>
宏。
echo list.filter(x => x > 2)
来自文档:
匿名过程的语法糖。
macro `=>`(p, b: untyped): untyped
proc passTwoAndTwo(f: (int, int) -> int): int =
f(2, 2)
passTwoAndTwo((x, y) => x + y) # 4
过程类型的语法糖。
macro `->`(p, b: untyped): untyped
proc pass2(f: (float, float) -> float): float =
f(2, 2)
# is the same as:
proc pass2(f: proc (x, y: float): float): float =
f(2, 2)