Как мне увидеть тип для операторов в F # интерактивный? - PullRequest
4 голосов
/ 17 марта 2011

Я пытаюсь изучить тип операторов, таких как :: в F # интерактив.

Но я получаю такие сообщения:

Unexpected symbol '::' in expression. Expected ')' or other token.

, даже если я окружаю его(::).

Ответы [ 3 ]

8 голосов
/ 17 марта 2011

Я делаю это так:

> let inline showmecons a b = a :: b;;

val inline showmecons : 'a -> 'a list -> 'a list

или

> let inline showmepow a b = a ** b;;

val inline showmepow :
   ^a ->  ^b ->  ^a when  ^a : (static member Pow :  ^a *  ^b ->  ^a)
4 голосов
/ 17 марта 2011

Вы увидите тип обычных операторов, если окружите их скобками:

> (+);;
val it : (int -> int -> int) = <fun:it@4-5>

К сожалению, это ограничивает тип оператора одним конкретным типом - F # Interactive не печатает полиморфныйопределение (с ограничениями).Вы можете использовать обходной путь, предложенный Стивеном (и определить новую inline функцию), чтобы увидеть это.

Причина, по которой он не работает для ::, заключается в том, что :: на самом деле является специальным синтаксическимконструкция (определена непосредственно в спецификации F #).

0 голосов
/ 10 сентября 2015

Это довольно старый, но я изучаю F # и тоже хотел это выяснить.

Глядя на F # спецификацию на странице 32, мы видим, что символические ключевые слова также имеютскомпилированное имя в F #.Эквивалентное скомпилированное имя для :: - op_ColonColon, которое фактически принимает кортежи:

> op_ColonColon;;
val it : arg0:'a * arg1:'a list -> 'a list = <fun:clo@22-5>`

Использование :: для определения встроенной функции даст нам функцию cons с каррированием, которая, как мне кажется, вводит в заблуждение.

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