Это теневая переменная в F #? - PullRequest
1 голос
/ 09 февраля 2020
        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 делает в этом коде, что это такое и почему оно там.

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Действительно, это затенение параметров.

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 # не имеет полиморфизм с более высоким родом . Возможно, вам лучше четко указать тип параметров, которые вы хотите принять, или включить их, если для вас важен универсальный c.

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
2 голосов
/ 09 февраля 2020

int - это функция, которая принимает тип со значением c член op_Explicit и возвращает целое число. string является наиболее распространенным примером этого:

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

В VS Code, если вы наведите курсор на int, вы увидите это:

enter image description here

Если вы позвоните print_scene("1", "2"), он должен вернуть тот же вывод, что и print_scene(1, 2).

Это теневое копирование:

let i = 1
let i = 2

Это не мутирует i. Я отсылаю вас к этому ответу .

...