f# 函数名称隐藏类型转换

f# functions name hiding type casting

我在搞乱 f#Koans,这将 运行 (2*2 = 2)。根据我的理解,当在四倍范围内时, 'double' 强制转换被本地函数隐藏。一旦退出,我就不会收到编译器错误,因为我找回了 'cast'?

  let NestingFunctions() =
        let quadruple x =    
            let double x =
                x * 2

            double(double(x))

        let result = quadruple 4
        let resultDouble =  double 2
        AssertEquality resultDouble 2

虽然它看起来像铸造,但实际上并非如此。转换运算符是 :>:?>,它们不能被覆盖。对于转换运算符,类型必须兼容。

double 函数就是一个函数,适用于任何实现显式转换运算符 (op_Explicit) 的对象。在 F# 中,我们称此为 以将 值转换为双倍值。

但是你的问题是关于范围的。如果您创建一个隐藏全局函数的函数,您仍然可以通过使用 global. 作为前缀将其返回到范围内。尽管正如其他人已经说过的那样,某些 built-in 函数不应该被隐藏,除非有充分的理由。

let NestingFunctions() =
    let quadruple x =  
        let double x =
            x * 2

        // FQN (fully qualified) works
        let bar = global.FSharp.Core.ExtraTopLevelOperators.double 42  
        // or in this case, just qualify with the module also works
        let xx = ExtraTopLevelOperators.double 42

        // these both call your self-defined 'double' function
        double(double(x))

    // from here, since we outdented, function 'double' is not in scope anymore
    let result = quadruple 4
    let resultDouble =  double 2  // this is the built-in function
    ()