#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()