Я бы предложил использовать модули F # List
или Seq
вместо методов LINQ.Тогда вы сможете использовать типы F #, такие как 'a -> 'a
вместо System.Func<'a, 'a>
, и вы можете передать id
в функцию forAll
.Если бы вы могли опубликовать полный пример, было бы легче дать вам полный ответ, но я думаю, что что-то вроде этого будет примерно эквивалентно тому, что вы делаете с LINQ:
let compare (rowComparer: ('a * 'a) -> bool) rows =
Seq.zip rows >> Seq.map rowComparer >> Seq.forall id
Это создаетфункция, которая принимает две последовательности и сравнивает каждое значение в первом с соответствующим значением во втором, генерируя последовательность логических значений.Затем он возвращает истину, если все значения в последовательности истинны, в противном случае он возвращает ложь.Это достигается с помощью компоновки функций и частичного применения для создания новой функции с требуемой сигнатурой.
Затем можно частично применить функцию сравнения строк, чтобы создать специализированную функцию сравнения для каждого из ваших сценариев, следующим образом:
let compareEqual = compare (fun (a,b) -> a = b)
compareEqual [0; 1; 2] [0; 1; 2] // true
compareEqual [0; 1; 2] [2; 1; 2] // false