У меня есть простая функция F # cost
, получающая единственный параметр amount
, который используется для некоторых расчетов. Это float
, поэтому мне нужно передать что-то вроде cost 33.0
, которое в математике совпадает с cost 33
. Компилятор жалуется на это, и я понимаю, почему, но я хотел бы, чтобы это можно было назвать так, я попытался создать еще одну функцию с именем той же и используемой аннотации типа для обоих из них, а также получить предупреждения о компиляторе. Есть ли способ сделать это, как это делает C#?Перегрузка функции F # с тем же номером параметра
ответ
Существуют два механизма в F # для достижения этой цели, и оба не полагаться на неявные слепков "как C#":
(A) Способ перегрузки
type Sample =
static member cost (amount: float) =
amount |> calculations
static member cost (amount: int) =
(amount |> float) |> calculations
Sample.cost 10 // compiles OK
Sample.cost 10. // compiles OK
(B) Using inlining
let inline cost amount =
amount + amount
cost 10 // compiles OK
cost 10. // compiles OK
inlining не будет работать, если функция стоимости использует некоторый плавающий литерал, например 'let inline cost amount = amount * 2. // val inline cost: float -> float' – Sehnsucht
@Sehnsucht, существуют специальные примитивы для использования в общих функциях. Проверьте 'LanguagePrimitives.GenericOne'. – bytebuster
@bytebuster уверен, что я знаю, моя точка зрения заключалась в том, что просто добавить 'inline' перед именем не всегда может быть достаточно. есть «GenericOne» и «GenericZero», мы можем даже делать некоторые вещи, используя «AdditionDynamic» и т. д., но это требует больших изменений. – Sehnsucht
если вы хотите использовать int на сайте вызова, но иметь поплавок внутри тела функции; почему бы просто не бросить его?
let cost amount =
// cast amount from to float (reusing the name amount to shadow the first one)
let amount = float amount
// rest of your function
Я хочу иметь возможность использовать оба варианта, иногда это может быть что-то вроде '38.6', это просто для облегчения, когда это не так (например, когда это' 39.0' сказать) – Luiso
@Luiso в системе типа F #; '33' и' 33.' (обратите внимание на точку) не то же самое и не являются взаимозаменяемыми. Если вы хотите последнего, вы не можете написать прежнего в одиночку и ожидать, что код угадает, что вы на самом деле имеете в виду. – Sehnsucht
F # не разрешает перегрузку функций с привязкой, но вы можете перегружать методы на classe как на C#.
Иногда вы можете использовать change the model to work on a Discriminated Union вместо набора перегруженных примитивов, но я не думаю, что было бы особенно разумно делать это, чтобы иметь возможность различать поплавки и целые числа.
- 1. Перегрузка функции с тем же типом параметра в C++
- 2. Получение другого результата с тем же номером
- 3. Группировка документов с тем же номером телефона
- 4. Match генерироваться шары с тем же номером
- 5. Передача функции в качестве параметра и перегрузка
- 6. Перегрузка функции-вызов-поведение в F #?
- 7. R - вычисление значения, присвоенные тем же номером
- 8. Template non-type перегрузка параметра
- 9. перегрузка F # активных шаблонов
- 10. Объединить две функции под тем же именем без перегрузки
- 11. SQL Group по проблеме с тем же номером ID
- 12. объединить элемент с тем же номером pcode и считать 1
- 13. TestFlight Upload с тем же номером версии во время выключения
- 14. Как выбрать несколько элементов с тем же серийным номером?
- 15. Спящий режим вставить дважды с тем же номером PK
- 16. Удалите повторяющиеся строки с тем же идентификационным номером
- 17. «Microsoft Edge PDF inline issue» с тем же номером
- 18. PHP получать значения из массива с тем же идентификатором «» номером
- 19. Перегрузка конструктора Entity с тем же объектом, что и параметр
- 20. F # Async - элемент с тем же ключом уже добавлен
- 21. различных значений с% D и% F с тем же варом
- 22. Задание типа параметра в объявлении функции F #
- 23. F # infix перегрузка не работает
- 24. C++ << перегрузка оператора одним и тем же типом
- 25. Как запустить функции с тем же именем?
- 26. Вызывать две функции с тем же именем
- 27. 2 функции с тем же именем
- 28. Пакеты с тем же именем функции
- 29. Python: две функции с тем же именем
- 30. Jquery множественной функции с тем же переменными
Что будет (в идеале) возвращаемым типом вашей функции стоимости? Всегда поплавок, такой же, как вход или другой тип? Это небольшая деталь, но она может определить, куда идти. – Gustavo