这是在 F# 中隐藏一个变量吗?

Is this shadowing a variable in F#?

        let print_scene (y, v) =
            do Console.Clear()

            let y, v = int y, int v    (* This is the code in question *)

            for j = 10 downto 0 do
                for i = 0 to 30 do
                    if (y + 1) = j && i = 15 then
                        Console.Write("b")
                    elif j = 0 || i = 0 || j = 10 || i = 30 then
                        Console.Write("*")
                    else
                        Console.Write(" ")
                Console.Write("\n")
            ignore(Console.ReadKey())

我不明白 int 在这段代码中做了什么,它是什么,或者它为什么在那里。

int 是一个函数,它采用具有静态成员 op_Explicit 和 returns 整数的类型。 string 是最常见的例子:

int "108" // returns `108` as an integer

在 VS Code 中,如果将鼠标悬停在 int 上,您将看到:

如果你调用 print_scene("1", "2") 它应该 return 与 print_scene(1, 2).

相同的输出

这是阴影:

let i = 1
let i = 2

这不会改变 i。我会推荐你​​参考这个 .

确实,这是参数阴影。

let foo bar =
    let bar = bar * bar
    bar

这在 F# 中绝对没问题。函数参数被绑定隐藏。没有任何改变 - 它只是使原始绑定无法访问。

更深层次的问题在于int。因为 int 将类型转换为 Int32,所以您希望该函数接受任何可以转换为 int 的内容;数字或字符串。 但是-

  let print_scene (y, v) =
         let y, v = int y, int v 
         ()

    print_scene (1.0, "2.0")
    print_scene (1.0,  2.0) //this won't compile

函数参数将在首次使用时受到限制。在这里,它的类型变成:

float * string -> unit

这是因为 F# 没有 higher-kinded polymorphism。 如果通用对您很重要,您最好明确说明要接受的参数类型或将其内联。

let inline print_scene (y, v) =
     let y, v = int y, int v 
     ()

print_scene (1.0, "2.0") 
print_scene (1.0, 2.0) //this works