这是在 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
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