F #: два способа определения функций? - PullRequest
0 голосов
/ 10 октября 2011

Эти два эквивалентны:

let f(x) =
    10

let g = fun(x) ->
    10

Я думаю? Кажется, они делают одно и то же, но есть ли случаи, когда поведение этих двух людей может отличаться? Я нахожу вторую версию полезной (даже более подробной), поскольку вы можете использовать операторы <| и << для реализации шаблонов декоратора в стиле Python; есть ли случай, когда у меня есть для использования первой версии?

Кроме того, я полностью понимаю, как работает второй (материал справа - просто выражение функции, которое я добавляю в g), но как насчет первого? Есть ли какой-то трюк с компилятором или особый случай, который преобразует этот синтаксис из простого оператора присваивания в определение функции?

Ответы [ 2 ]

4 голосов
/ 10 октября 2011

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

3 голосов
/ 10 октября 2011

Как уже ответил Брайан, оба эквивалентны. Возвращение fun вместо объявления функции с использованием let имеет значение, если вы хотите что-то сделать (т.е. выполнить некоторую инициализацию) перед возвратом функции.

Например, если вы хотите создать функцию, которая добавляет случайное число, вы можете написать:

let f1 x = 
  let rnd = new System.Random()
  x + rnd.Next()

let f2 = 
  let rnd = new System.Random()
  fun y -> y + rnd.Next()

Здесь функция f1 создает новый экземпляр Random каждый раз, когда он выполняется, но f2 все время использует один и тот же экземпляр rnd (поэтому f2 - лучший способ написать это). Но если вы немедленно вернете fun, то компилятор F # оптимизирует код, и оба случая совпадают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...