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