C#泛型中的不动点生成器

时间:2012-01-10 23:03:28

标签: c# haskell functional-programming combinators

我试图在C#中定义一个固定点生成器,您可以在许多函数式语言中看到它。我认为折叠器通常有时用定点发生器来定义。我将展示它的Haskell定义,然后展示我在C#中的定义。非常感谢任何帮助。

//Haskell
fix f = f (fix f)

//C# (Many attempts)
public static Func<Func<T, T>, T> Combinator1<T>(this Func<T, T> f)
{
    return x => f(Combinator1(f)(x));
}
public static Func<Func<T, T>, T> Combinator2<T>(this Func<T, T> f)
{
    return x => x(Combinator2(x)(f));
}
public static Func<T, U> Combinator3<T, U>(Func<Func<T, U>, Func<T, U>> f)
{
    return f(x => Combinator3(f)(x));
}

2 个答案:

答案 0 :(得分:4)

我对haskell或这个运算符了解不多。但是我已经阅读了Mads Torgersen关于使用C#lambda表达式实现Y / Fix组合器的文章。它可能对你有用,这里是link

这是他实施的最终方法:

public Func<T, T> Fix<T>(Func<Func<T,T>, Func<T,T>> F) {
  return t => F(Fix(F))(t);
}

答案 1 :(得分:4)

首先, Y组合器是无类型lambda演算中的特定实现。我们更普遍地谈论定点组合器。

这里给出的所有答案都非常清楚地表明为什么定点组合器没有合理就没有意义。 Lukazoid给出的那个并不像它应该的那样普遍。它有这种类型(用Haskell表示法):

lukazoidFix :: ((a -> b) -> a -> b) -> a -> b

一个真正的定点组合器应该更具多态性。

fix :: (a -> a) -> a