Frage

Ich habe versucht, einen Fixpunktgenerator in C# zu definieren, den Sie in vielen funktionalen Sprachen sehen. Ich glaube, dass FILDR normalerweise in Bezug auf einen festen Punktgenerator definiert ist. Ich werde zeigen, dass es Haskell Definition ist und dann was ich in C#habe. Jede Hilfe wird sehr geschätzt.

//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));
}
War es hilfreich?

Lösung

Ich habe nicht viel Verständnis für Haskell oder diesen Bediener. Aber ich habe einen Artikel von Mads Torgersen über die Implementierung des Y/Fix -Kombinators mit C# Lambda -Ausdrücken gelesen. Es kann für Sie von Nutzen sein, hier ist das Verknüpfung.

Und hier ist die endgültige Methode, die er implementiert:

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

Andere Tipps

Zuerst, der Y -Kombinator ist eine besondere Implementierung in Untyped Lambda Calculus. Wir sprechen allgemeiner über Fixpunktkombinatoren.

Alle hier gegebenen Antworten zeigen hervorragend, warum Fixpunktkombinatoren ohne Currying nicht wirklich sinnvoll ist. Der von Lukazoid gegebene, ist nicht so allgemein wie es sein sollte. Es hat diesen Typ (in Haskell Notation):

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

Ein echter Fixpunktkombinator sollte viel polymorpher sein.

fix :: (a -> a) -> a
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top