2016-04-03 3 views
2

С answer by kvb о том, как назвать неявные операторы преобразования:Пожалуйста, объясните этот синтаксис

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

Я знаю F # на некоторое время, но я просто не знаю, как разобрать реализацию здесь. Что такое (^a or ^b)? И после этого? Пожалуйста, переходите к тому, что каждая часть представляет грамматически.

+1

Обязательно дубликат на SO где-то - см. Документы https://msdn.microsoft.com/en-au/library/dd548046.aspx –

+0

Документы объясняют ограничения, но не вызовы функций, которые видны здесь. – Asik

ответ

6

^a or ^b означает буквально «^a или ^b».

Двоеточие : означает «имеет» или «содержится в», в зависимости от того, как вы на него смотрите.

Таким образом, все выражение (^a or ^b) : (static member op_Implicit : ^a -> ^b) означает «статический член с именем„op_Implicit“, который имеет тип ^a -> ^b и определяется на любом типе ^a или тип ^b». Все это выражение в конечном счете оценивает функцию типа ^a -> ^b.

Затем x, расположенный справа от этого выражения, означает «приложение-функция», как и в обычном синтаксисе F #.

Так что все это вместе взятое будет означать «по типу ^a или типа ^b, найти статический член с именем„op_Implicit“, который имеет тип ^a -> ^b, и применять этот элемент в аргументе x».

Для более подробного обсуждения статически разрешенных ограничений см. this answer или this MSDN article.

Смежные вопросы