Почему в F # нет неявных преобразований? - PullRequest
8 голосов
/ 06 ноября 2010

F # не поддерживает неявные преобразования. Я понимаю, что это особенность, но я не понимаю, почему неявные преобразования запрещены, даже если информация не будет потеряна. Например:

sqrt 4      // Won't compile.

Я не вижу проблемы неявного преобразования int 4 в float, что и требуется sqrt.

Кто-нибудь может пролить свет на это?

Ответы [ 3 ]

13 голосов
/ 06 ноября 2010

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

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

7 голосов
/ 06 ноября 2010

Смотри также

http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/

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

5 голосов
/ 06 ноября 2010

В дополнение к вышеприведенным ответам преобразования типов между целым числом и числом с плавающей запятой фактически не бесплатны в вычислительном отношении; компилятор не делает вам одолжение, «скрывая» их от вас, если ваша цель - написать высокопроизводительный код. Это одна из вещей, которые мне нравятся в OCaml и F #: даже если они очень высокого уровня, вам все равно нужно знать, какие именно вычисления вы делаете.

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