2011-01-02 1 views
0

Я искал StackOverflow (и другие источники) для этого ответа, но не могу найти ничего.F # Методы расширения в списках, IEnumberable и т. Д.

В C#, если бы я имел определение виджета, скажу:

class widget 
{ 
    public string PrettyName() { ... do stuff here } 
} 

, и я хотел, чтобы обеспечить легкую печать списка виджетов, я мог бы сделать это:

namespace ExtensionMethods 
{ 
    public static PrintAll(this IEnumerable<Widget> widgets, TextWriter writer) 
    { 
     foreach(var w in widgets) { writer.WriteLine(w.PrettyName()) } 
    } 
} 

Как я бы выполнил нечто подобное с типом записи и коллекцией (List или Seq предпочтительнее в F #). Мне бы хотелось иметь список Widgest и иметь возможность вызвать функцию прямо в коллекции, которая сделала что-то вроде этого. Предположим (поскольку это F #), что функция не будет изменять состояние коллекции, к которой она привязана, но возвращает некоторое новое значение.

ответ

4

Точно аналогичное решение невозможно в F #. Члены расширения F # могут быть определены только так, как если бы они были членами исходного типа, поэтому вы можете определять расширения F # для общего типа IEnumerable<'T>, но не для конкретных экземпляров, таких как IEnumerable<Widget>.

В C# методы расширения часто используются для обеспечения более свободного стиля кодирования (например, myWidgets.PrintAll(tw)). В F # вы обычно просто определяете функцию let-bound и используете оператор конвейера для достижения аналогичного эффекта. Например:

module Widget = 
    let printAll (tw:TextWriter) s = 
    for (w:Widget) in s do 
     writer.WriteLine(w.PrettyName()) 

open Widget 
let widgets = // generate a sequence of widgets somehow 
let tw = TextWriter() 
widgets |> printAll tw 
+0

Как определить функцию printAll как члена в типе записи виджетов для использования в приведенном выше сценарии? – fbl

+0

@ flevine100 - Обычно вы не определяете printAll как член в типе, а как функцию с ограничением в модуле. Я отредактировал свой ответ, чтобы включить пример. – kvb

+0

спасибо! - Функциональное программирование - это, безусловно, другой подход к организации кода. – fbl