F# 既有类型化代码引用,也有非类型化代码引用,我想知道在什么用例中人们会选择其中一种而不是另一种?
区别只是为了方便,非类型化和类型化引文在所有情况下都可以转换为每种类型,或者是类型化引文 e。 G。可能使用非类型化引用的子集?
是否有任何示例仅适用于键入的引文,但不适用于非键入的引文 - 或者反之亦然?
一般来说,我建议尽可能使用键入的引文。像往常一样,这些类型将允许您静态地强制执行一些正确性条件,否则可能会导致运行时失败。考虑:
let one = <@@ "one" @@>
// exception at runtime
let two = <@@ 1 + %%one @@>
相对于
let one = <@ "one" @>
// compile time error: the type 'string' does not match the type 'int'
let two = <@ 1 + %one @>
此外,有时,在键入引用不需要的情况下,非键入引用需要额外的类型注释:
// ok
let l = <@ [1] @>
let l2 = <@ List.map id %l @>
// fails at runtime (obj list assumed instead of int list)
let l = <@@ [1] @@>
let l2 = <@@ List.map id %%l @@>
// ok
let l = <@@ [1] @@>
let l2 = <@@ List.map (id:int->int) %%l @@>
但是,如果您正在用引号构建极其通用的东西,则可能无法使用类型化的引号(例如,因为类型不是静态已知的)。从这个意义上说,无类型引用给你带来了更大的灵活性。
另请注意,根据需要在类型化和非类型化引用之间进行转换非常容易(向上转换Expr<_>
to Expr
从有类型变为无类型;使用Expr.Cast
走另一条路)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)