Continuando my investigation de expresar ideas de F # en C#, quería un operador de reenvío de pipa. Para cualquier cosa envuelta en un IEnumerable, ya la tenemos, como puedas .NextFunc() para tu corazón. Pero, por ejemplo, si tiene una reducción tipo pliegue al final, no puede alimentar el resultado de eso en una función.Reenvíos de tuberías en C#
Aquí son dos métodos de extensión, Me preguntaba si alguien más había intentado esto, y si es una buena idea o no (EDIT: ahora con Earwicker's Maybe incluido):
public static void Pipe<T>(this T val, Action<T> action) where T : class
{ if (val!=null) action(val); }
public static R Pipe<T, R>(this T val, Func<T, R> func) where T : class where R : class
{ return val!=null?func(val):null; }
A continuación, puede escribir algo como:
Func<string, string[]> readlines = (f) => File.ReadAllLines(f);
Action<string, string> writefile = (f, s) => File.WriteAllText(f, s);
Action<string, string> RemoveLinesContaining = (file, text) =>
{
file.Pipe(readlines)
.Filter(s => !s.Contains(text))
.Fold((val, sb) => sb.AppendLine(val), new StringBuilder())
.Pipe((o) => o.ToString())
.Pipe((s) => writefile(file, s));
};
(lo sé, Filtro == Cuando en C#, y plegar == agregada, pero quería rodar la mía, y que podría tener WriteAllLines hecho, pero ese no es el punto)
EDITAR: correcciones según el comentario de Earwicker (si he entendido bien).
Creo que esto se llama componer, no de tuberías. – leppie
No, pero están relacionados, mira aquí: http://blogs.msdn.com/chrsmith/archive/2008/06/14/function-composition.aspx – Benjol
Par de errores: necesitas una restricción 'donde T: clase 'o no se puede comparar con nulo. Además, solo has puesto el cheque de nulo en la versión de Func. En un mundo ideal, solo necesitaría escribir la versión de Func: consulte 'void' en http://stackoverflow.com/questions/27731/whats-wrong-with-c#303071 –