По поводу Seq.compareWith вы написали:
не совсем, две проблемы 1) ожидает
две последовательности одного типа, 2)
не закорачивает
2) неправильно, функция действительно выполняет функцию суда.
1) верно. Возьмите Seq.compareWith из библиотеки F #, измените (или удалите) аннотацию типа, и она будет работать для последовательностей разных типов.
[<CompiledName("CompareWith")>]
let compareWith (f:'T1 -> 'T2 -> int) (source1 : seq<'T1>) (source2: seq<'T2>) =
//checkNonNull "source1" source1
//checkNonNull "source2" source2
use e1 = source1.GetEnumerator()
use e2 = source2.GetEnumerator()
let rec go () =
let e1ok = e1.MoveNext()
let e2ok = e2.MoveNext()
let c = (if e1ok = e2ok then 0 else if e1ok then 1 else -1)
if c <> 0 then c else
if not e1ok || not e2ok then 0
else
let c = f e1.Current e2.Current
if c <> 0 then c else
go ()
go()
Теперь вы можете отправить электронное письмо на fsbugs (@ microsoft.com) и попросить его удалить ограничение типа в следующем выпуске F #.