質問

多くの機能言語で見られる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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top