Question

J'ai essayé de définir un générateur de point fixe en C # que vous voyez dans de nombreuses langues fonctionnelles. Je crois foldr est généralement défini en termes d'un générateur de point fixe parfois. Je vais montrer sa définition Haskell et ce que j'ai en C #. Toute aide est grandement appréciée.

//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));
}
Était-ce utile?

La solution

Je n'ai pas beaucoup de compréhension haskell ou cet opérateur. Mais j'ai lu un article de Mads Torgersen à propos de la mise en œuvre du combinateur Y / Fix en utilisant des expressions C # lambda. Il peut être utile pour vous, voici le lien .

Et voici la dernière méthode qu'il met en œuvre:

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

Autres conseils

Tout d'abord, Y Combinator est une implémentation particulière dans le calcul typées lambda. Nous parlons plus généralement combinateur de point fixe.

Toutes les réponses données ici montrent très bien pourquoi combinateur de point fixe ne font pas vraiment de sens sans curryfication. Celle donnée par Lukazoid n'est pas aussi général que cela devrait être. Il a ce type (en notation Haskell):

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

Un combinateur point réel fixe devrait être beaucoup plus polymorphes.

fix :: (a -> a) -> a
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top