Предупреждение: это довольно некрасиво. Мне очень любопытно более элегантные подходы.
Нет (seq * seq) типа. Вы должны будете проверить каждый параметр в отдельности. Что-то вроде
match (a,b) with
| (:? seq<_> as seqa), (:? seq<_> as seqb) -> ...
Но это дает ошибку компилятора, потому что для типов a и b требуется больше аннотаций типов. Но это ограничит параметры таким образом, что вы не сможете сделать что-то вроде eq 2 2.
Фрагмент ниже исправит это:
let eq a b =
match (box a, box b) with
| (:? seq<_> as seqa), (:? seq<_> as seqb) ->
printfn "comparing sequences..."
Seq.map2 (fun xA xB -> xA = xB) seqa seqb |> Seq.forall id
| _ -> printfn "comparing default..."
a=b
Но результат сравнения двух последовательностей не соответствует ожидаемому:
> eq {1..10} {1..10};;
comparing default...
val it : bool = false
Переходит ко второму предложению о совпадении. Это связано с тем, что компилятор ограничил типы seq <_> до seq, и он получил два seq.
Чтобы сравнить две последовательности, они должны быть преобразованы в Seq следующим образом:
> eq1 (Seq.map box {1..10}) (Seq.map box {1..10});;
comparing sequences...
val it : bool = true
> eq1 (Seq.map box {1..10}) (Seq.map box {1L..10L});;
comparing sequences...
val it : bool = false
Это сказал, я думаю, что это довольно уродливый хак. Я бы предложил написать функцию сравнения последовательностей, которая проверяет только последовательности.