如何调用此func代码段?

时间:2011-09-09 13:09:42

标签: c# func

我在monad上看这篇文章:

http://blogs.msdn.com/b/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx

我在VS2010的副本中编写代码,但是对于以下代码:

public static Func<T, V> Compose<T, U, V>(this Func<U, V> f, Func<T, U> g)
{
    return x => f(g(x));
}

我该怎么称呼?

此外,文章指出:

  

函数组合采用两个函数,并将第二个函数的结果输入到第一个函数的输入中,从而形成一个函数。

这不仅仅是管道吗?

代码示例:

var r = f.Compose(g)(x);

不编译。

另外,

由于

2 个答案:

答案 0 :(得分:5)

这不起作用?请注意,Extension方法必须位于公共静态类中,方法本身必须是静态的。

public static class FunctionalExtensions
{
    public static Func<T, V> Compose<T, U, V>(this Func<U, V> f, Func<T, U> g)
    {
        return x => f(g(x));
    }
}

class Program
{
    static void Main(string[] args)
    {
        Func<double, double> 
            f1 = Square,         // Func<double, double> is a delegate type so we have to create
            g1 = AddOne,         // an instance for both f and g
            h1 = f1.Compose(g1); // This is a Func<double, double> now, (i.e. h(X) = f(g(x)) )

        // To call new function do this
        double result1 = h1(5.0);

        Func<double, double>
            f2 = x => x*x,       
            g2 = x => x + 1,       
            h2 = f2.Compose(g2);

        // To call new function do this
        double result2 = h2(5.0);
    }

    public static double Square(double x)
    {
        return x * x;
    }

    public static double AddOne(double x)
    {
        return x + 1;
    }
}

另请注意f1:double - &gt; double和g1:double - &gt;双

在撰写函数

f:V - &gt; U和g:U - &gt; Ť

所以f.g:V - > Ť

换句话说,在我的例子中,并非所有类型都必须加倍。你只需要确保域名 函数f(外部函数)包括函数g的范围(内部函数)。在编程中 这意味着g的返回类型需要与f的参数类型相同(或隐式地转换为)。

答案 1 :(得分:0)

public static class Extensions
{
    // Note extension methods need to be defined in a static class
    public static Func<T, V> Compose<T, U, V>(this Func<U, V> f, Func<T, U> g)
    {
        return x => f(g(x));
    }
}

public class CallingClass
{
    public void CallingMethod()
    {
        Func<string, int> f1 = s => int.Parse(s);
        Func<int, double> f2 = i => i / 2.0;

        // Note which way round f1 and f2 go
        Func<string, double> composed = f2.Compose(f1);

        var result = composed("3");

        // Now result == 1.5
    }
}