Подтвердить что ты не робот

Недокументированное использование ключевого слова `when` в FSharp.Core

Поиск информации о параметрах статически разрешенных типов для встроенных функций Я наткнулся на определения различных примитивных операторов в FSharp.Core:

let inline (+) (x: ^T) (y: ^U) : ^V = 
     CheckedAdditionDynamic<(^T),(^U),(^V)>  x y 
     when ^T : int32       and ^U : int32      = (# "add.ovf" x y : int32 #)
     when ^T : float       and ^U : float      = (# "add" x y : float #)
     // <snip>
     when ^T : ^T = ((^T or ^U): (static member (+) : ^T * ^U -> ^V) (x,y))

Как видно из фрагмента выше ключевое слово when используется в формате: when expr1 = expr2 для различных встроенных типов. Я предполагаю, что это своего рода эквивалент компилятора "если T = int использует код операции add.ovf, иначе if..., else do that".

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

4b9b3361

Ответ 1

Пользователь Carsten предоставил следующий комментарий к этому ответу, поскольку считает, что это неправильно.

вещь: when используется как здесь, не имеет ничего общего с документированные обычаи - это, по-видимому, называется статическим условным оптимизации и не должны использоваться вне основных библиотек - действительно продолжайте и пытайтесь использовать его - вы увидите, что не можете, если только вы используете трюки, упомянутые в ответе Джона (другой вопрос)

Пользователь Carsten добавил дополнительный комментарий к этому ответу:

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

Ответ, упомянутый в Carsten, первый комментарий пользователя пользователя John Palmer в апреле 2013 года, который ссылается на этот ответ, который он предоставил по синтаксису (# ..... #), Что такое (#... #) синтаксис в реализации стандартной библиотеки F3?

Фактически вы можете использовать это, но вы должны указать --compiling-fslib (недокументированные) и --standalone флаги в вашем коде.

Пользователь MisterMetaphor предоставил ответ со ссылкой на сообщение на форуме, в котором говорилось следующее:

Встраиваемый IL в коды F #. Поддерживается ли эта функция?

Не совсем. Цель этой функции 99,9% - для операций определенный в файле FSharp.Core.dll(называемый fslib.dll в 1.9.2.9 и ранее).

Для других целей использования ключевого слова when см. следующее.

В этом документе Microsoft описывается использование ключевого слова when для дополнительных условий сопоставления, Match Exions (F #).

В этом документе Microsoft описывается использование ключевого слова when для выражения ограничений для параметров типового типа, Ограничения (F #).

Также см. этот документ Microsoft, описывающий соответствие шаблонов с ключевым словом when в различных настройках, Match Matching (F #).

Документ соответствия шаблону говорит следующее вместе с несколькими примерами.

Шаблоны - это правила для преобразования входных данных. Они используются на языке F # для сравнения данных с логической структурой или структуры, разлагать данные на составные части или извлекать информация из данных по-разному.

Документ соответствия выражает следующее вместе с примером.

Вы можете использовать предложение when, чтобы указать дополнительное условие, согласно которому переменная должна соответствовать шаблону. Такое положение относится к как охранник. Выражение, следующее за ключевым словом when, не оценивается если не сопоставляется шаблон, связанный с этим защитником.