2

多くの関数型言語で見られる固定小数点ジェネレーターを C# で定義しようとしました。私は、foldr は通常、固定小数点ジェネレーターの観点から定義されると考えています。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));
}
4

2 に答える 2

4

まず第一に、Y コンビネータは型なしラムダ計算の特定の実装です。不動点コンビネータについてより一般的に話しています。

ここで与えられたすべての答えは、カリー化なしでは不動点コンビネーターが本当に意味をなさない理由を見事に示しています。ルカゾイドによって与えられたものは、本来あるべきほど一般的ではありません. 次の型があります (Haskell 記法で):

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

実際の固定小数点コンビネータは、より多態的であるべきです。

fix :: (a -> a) -> a
于 2012-01-11T08:55:49.453 に答える
4

私は haskell やこの演算子についてあまり理解していません。しかし、C# ラムダ式を使用した Y/Fix コンビネーターの実装に関する Mads Torgersen の記事を読みました。役に立つかもしれません。ここにリンクがあります。

そして、彼が実装する最終的な方法は次のとおりです。

public Func<T, T> Fix<T>(Func<Func<T,T>, Func<T,T>> F) {
  return t => F(Fix(F))(t);
}
于 2012-01-10T23:08:09.370 に答える