Встроенное равенство списков с помощью пользовательской функции сравнения? - PullRequest
1 голос
/ 29 марта 2011

Есть ли встроенная функция, которая выполняет следующие действия?

let rec listsEqual xl yl f =
    match xl, yl with
    | [], [] -> true
    | [], _ | _, [] -> false
    | xh::xt, yh::yt -> if f xh yh then listsEqual xt yt f else false

Обновлено, уточнение: и вообще есть ли способ подключиться к структурному сравнению, кроме использования пользовательской функции сравнения?

Ответы [ 2 ]

3 голосов
/ 29 марта 2011
List.forall2 : (('a -> 'b -> bool) -> 'a list -> 'b list -> bool)

Но это занимает f перед списками.Вы можете создать свою функцию следующим образом:

let listsEqual x y f =
    if List.length x = List.length y then
        List.forall2 f x y
    else
        false

Помните, что List.forall2 предполагает, что длины одинаковы.

2 голосов
/ 30 марта 2011

По поводу 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 #.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...