Я наткнулся на какое-то "странное поведение". Я использовал интерактивный F # для проверки кода и написал
Seq.zip "ACT" "GGA" |> Seq.map ((<||) compare)
// val it : seq<int> = seq [-1; -1; 1]
Затем я хотел сделать из него функцию и написал
let compute xs ys = Seq.zip xs ys |> Seq.map ((<||) compare)
// val compute : xs:seq<'a> -> xs:seq<'a> -> seq<int> when 'a : comparison
Это обобщило первый фрагмент кода, и я подумал, что это хорошо... пока я не попытался его использовать
compute "ACT" "GGA"
// val it : seq<int> = seq [-6; -4; 19]
Итак, как-то compare
действует по-разному для "той же вещи", когда есть другая "точка зрения" (явный тип vs generics)
Я знаю, как его решить: либо явным явлением типа
let compute (xs: #seq<char>) // ... or char seq or string
Или сохранение типа generic и составление с помощью функции sign
let compute (* ... *) ((<||) compare >> sign)
tl; dr вопрос заключается в том, где разница в поведении происходит точно?