На самом деле существует способ «переназначить» существующие операторы, используя статические ограничения и перегрузки.
type ListExtension = ListExtension with
static member (?<-) (ListExtension, a , b) = a @ b
static member inline (?<-) (ListExtension, a , b) = a + b
let inline (+) a b = (?<-) ListExtension a b
// test
let lst = [1;2] + [3;4]
// val lst : int list = [1; 2; 3; 4]
let sum = 1 + 2 + 3 + 4
// val sum : int = 10
При использовании троичного оператора статические ограничения будут автоматически выведены, другой вариант будетсоздать метод и написать ограничения вручную.Первая перегрузка покрывает случай, который вы хотите добавить (списки), вторая охватывает существующее определение.
Так что теперь в вашем коде вы можете сделать:
for x in (+) a b do
Console.WriteLine(x)
И это не сломаетсясуществующий (+)
для числовых типов.