F# расширение ограниченного массива

#generics #f# #extension-methods #generic-programming

#общие сведения #f# #методы расширения #generic-программирование

Вопрос:

Допустим, у меня есть следующий фрагмент

 type 'T``[]`` when 'T : (static member ( ) : 'T -> 'T -> 'T) with
    member inline self.sum = Array.fold (   ) self
  

Надеюсь, очевидно, что я хочу добавить метод расширения только тогда, когда ‘T поддерживает оператор.

Однако я продолжаю получать следующие ошибки:

Error FS0957 One or more of the declared type parameters for this type extension have a missing or wrong type constraint not matching the original type constraints on '[]<_>'

Возможен ли такой специфический метод расширения? Если это так, чего мне не хватает?

Ответ №1:

Лучшее, что я мог придумать, было

 type 'T``[]`` with
    member inline this.mysum< ^T when ^T : (static member ( ) : ^T * ^T -> ^T)>() = 
        Array.reduce (fun v1 v2 -> (^T : (static member ( ): ^T * ^T -> ^T)  (v1, v2)))
  

который по-прежнему не работает (по крайней мере, в FSI — не пробовал компилировать). Я не уверен, что это вообще возможно.

Вместо этого я предлагаю вам использовать IEnumerable<_> методы расширения в System.Linq :

 open System.Linq
[| 1..10 |].Sum()