EDIT
Более подробная / свежая информация здесь: Обобщение частично примененной функции
(оригинал ниже)
Я думаю, что прагматическая вещь здесь состоит не в том, чтобы попытаться понять это слишком глубоко, а в том, чтобы узнать пару общих стратегий, чтобы преодолеть виртуальную реальность и продолжить свою работу. Это немного «ответ», но я не уверен, что имеет смысл тратить время на понимание внутрикамерной системы типа F # (которая продолжает меняться незначительно от выпуска к выпуску) здесь.
Вот две основные стратегии, которые я бы отстаивал. Во-первых, если вы определяете значение с помощью типа функции (введите со стрелкой '->'), то убедитесь, что это синтаксическая функция, выполнив eta-translation :
// 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 / обобщений, укажите полную сигнатуру типа, чтобы сказать, что вы хотите (а затем «отступите», как позволяет 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»). («Встроенный» метод специального полиморфизма - это то, как математические операторы в F # преодолевают отсутствие «классов типов».)
Это проблема «синтаксической функции», которую я обсуждал выше; «Давайте скомпилируем в поля / свойства, которые, в отличие от функций, не могут быть общими. Так что, если вы хотите, чтобы он был общим, сделайте его функцией. (См. Также этот вопрос для другого исключения из этого правила.)