Ответ 1
ИЗМЕНИТЬ
Лучшая/последняя информация находится здесь: Сохранение частично примененной общей функции
(оригинал ниже)
Я думаю, что прагматичная вещь здесь - не пытаться понять это слишком глубоко, а скорее знать пару общих стратегий, чтобы пройти мимо VR и продолжить работу. Это немного ответ "cop out", но я не уверен, что имеет смысл тратить время на понимание внутриутробных систем типа F # (которые по-прежнему меняются незначительными способами от выпуска до выпуска).
Две основные стратегии, которые я бы отстаивал, - это. Во-первых, если вы определяете значение с помощью типа функции (тип со стрелкой "- > " ), тогда убедитесь, что это синтаксическая функция, выполнив eta конверсия:
// function that looks like a value, problem
let tupleList = List.map (fun x -> x,x)
// make it a syntactic function by adding argument to both sides
let tupleList l = List.map (fun x -> x,x) l
Во-вторых, если вы все еще сталкиваетесь с проблемами VR/generalizing, тогда укажите полную подпись типа, чтобы сказать, что вы хотите (а затем "отступить", как позволяет F #):
// below has a problem...
let toleq (e:float<_>) a b = (abs ( a - b ) ) < e
// so be fully explicit, get it working...
let toleq<[<Measure>]'u> (e:float<'u>) (a:float<'u>) (b:float<'u>) : bool =
(abs ( a - b ) ) < e
// then can experiment with removing annotations one-by-one...
let toleq<[<Measure>]'u> e (a:float<'u>) b = (abs ( a - b ) ) < e
Я думаю, что эти две стратегии - лучший прагматичный совет. Тем не менее, здесь моя попытка ответить на ваши конкретные вопросы.
-
Я не знаю.
-
' > ' - это полностью общая функция ('a → ' a → bool), которая работает для всех типов, и, таким образом, is_bigger обобщает. С другой стороны, "+" является "встроенной" функцией, которая работает на нескольких примитивных типах и определенном классе других типов; он может быть обобщен только внутри других "встроенных" функций, иначе он должен быть привязан к определенному типу (или будет по умолчанию "int" ). (Метод "inline" ad-hoc-полиморфизма - это то, как математические операторы в F # преодолевают отсутствие "классов типов".)
-
Это проблема "синтаксической функции", о которой я говорил выше; 'скомпилировать в поля/свойства, которые, в отличие от функций, не могут быть общими. Поэтому, если вы хотите, чтобы он был общим, сделайте его функцией. (См. Также этот вопрос для другого исключения из этого правила.)