Хранение ссылок на локальные переменные в F # - PullRequest
0 голосов
/ 29 февраля 2020

Таким образом, функциональное программирование все еще довольно ново для меня, и я пытаюсь понять идею избежать удержания (или, скорее, мутирования) «состояния». Я думаю, что я путаю эту концепцию с переменными let. Есть ситуации, когда мне нужно передать результат функции нескольким другим функциям. Например, в следующем коде

let doSomething a b f g = ((a |> b |> f), (a |> b |> g))

значение b(a) вычисляется дважды без необходимости. Вместо этого я хочу

    let result = b a
    ((f result), (g result))

Однако я чувствую, что это как-то нарушает соглашение в функциональном программировании? Считается ли использование разрешенных переменных таким образом как состояние удержания? Одной из альтернатив является

    match a |> b with
    | result -> ((f result), (g result))

Но это похоже на то, что вы делаете по сути то же самое, что и раньше. Интересно, если эта проблема связана с недостатком моего подхода к функциональному программированию, где, возможно, эти проблемы никогда не приходят в первую очередь? Или, может быть, так как пусть связанные переменные являются неизменяемыми, использовать их первым способом вполне нормально, и я полностью обдумываю это? Извиняюсь, если это немного расплывчато.

1 Ответ

1 голос
/ 01 марта 2020

Вы можете избежать привязки let, используя лямбда-выражение

let doSomething a b f g = b a |> (fun x -> f x, g x)
...