C#ジェネリックの固定点ジェネレーター
-
26-10-2019 - |
質問
多くの機能言語で見られる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));
}
解決
Haskellやこのオペレーターについてはあまり理解していません。しかし、C#Lambda式を使用してY/Fixコンビネーターの実装についてのMads Torgersenの記事を読みました。それはあなたに慣れているかもしれません、ここにあります リンク.
そして、彼が実装する最終的な方法は次のとおりです。
public Func<T, T> Fix<T>(Func<Func<T,T>, Func<T,T>> F) {
return t => F(Fix(F))(t);
}
他のヒント
初めに、 Yコンビネーター Untyped Lambda計算の特定の実装です。私たちはより一般的に、固定点の組み合わせについて話しています。
ここで与えられるすべての答えは、なぜ固定点の組み合わせがカリーなしで本当に意味をなさないのかを非常に示しています。ルカゾイドによって与えられたものは、本来あるべきほど一般的ではありません。このタイプがあります(Haskell Notation):
lukazoidFix :: ((a -> b) -> a -> b) -> a -> b
実際の固定点コンビネーターは、はるかに多型でなければなりません。
fix :: (a -> a) -> a
所属していません StackOverflow