Почему вы не можете добавить литералы int и float в F#?
В F#, если вы пишете 3 + 2.5
Вы получаете синтаксическую ошибку. Вы должны написать, например, 3. + 2.5
чтобы заставить его работать, что может раздражать в областях с тяжелой математикой и множеством числовых литералов.
Видя, что многие другие языки (например, C#) прекрасно справляются с этой задачей, есть ли конкретная причина, по которой F# неявно не преобразует литералы int в float (насколько мне известно, это преобразование без потерь) при выполнении арифметических операций?
2 ответа
Это правда, что int
в float
безопасно". Однако отсутствие явного преобразования между типами вообще считается хорошей особенностью F#, как уже упоминали другие.
F# имеет гораздо более обширный вывод типов, чем C#. Типы, которые выводятся при использовании, могут быть переданы полностью через большую кодовую базу. Неявное преобразование между числовыми типами может усложнить этот вывод, что усложнит понимание ошибок типов и увеличит бремя обслуживания самого кода компилятора. Фактически, F# не выполняет никаких неявных преобразований, определенных в C#.
Устраняя ненужные преобразования, неявные преобразования могут улучшить читаемость исходного кода. Однако, поскольку для неявных преобразований не требуется, чтобы программисты явно приводили данные от одного типа к другому, необходимо соблюдать осторожность, чтобы предотвратить непредвиденные результаты.
Опять же, это уменьшает удобство, но уменьшает вероятность неправильного поведения, что может быть намного большим неудобством позже или для кого-то еще.
По сути, этот подход меняет некоторое удобство на другое (не нужно везде писать имена типов) и повышает безопасность / явность. Я лично думаю, что это хороший компромисс для F#.
F# - это функциональный первый язык, одно из основных значений функциональных языков заключается в том, чтобы рассуждать о вашем коде. Какой способ сказать, легко понять, что делает ваш код и что он делает. Теперь явные операции означают, что ваш код будет легче рассуждать, не верьте мне?
Вот код Python, который принимает число, превращает его в строку, а затем обратно в число, угадайте, что он возвращает:
float(str(0.47000000000000003))
Вы догадались 0,47000000000000003? Извините, это на самом деле 0.46999999999999997! При конвертации из двойного в десятичное число во всплывающее! Лучше всего выбрать тип и придерживаться его. Теперь постоянная необходимость указывать тип может поначалу показаться раздражающей, но не нужно беспокоиться о том, какие типы используют ваши функции, по сравнению с типами, которые отправляются... Бог поможет вам, если библиотека выберет для вас типы как ну... ну, скажем так, со временем вы оцените откровенность;)