Pregunta

He intentado definir un generador de puntos fijos en C# que ve en muchos idiomas funcionales. Creo que a veces se define FOLDR en términos de un generador de puntos fijos. Mostraré que es la definición de Haskell y luego lo que tengo en C#. Cualquier ayuda es muy apreciada.

//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));
}
¿Fue útil?

Solución

No tengo mucha comprensión de Haskell o este operador. Pero he leído un artículo de Mads Torgersen sobre la implementación del combinador Y/Fix usando expresiones C# lambda. Puede ser de alguna utilidad para usted, aquí está el Enlace.

Y aquí está el método final que implementa:

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

Otros consejos

Ante todo, el combinador y es una implementación particular en el cálculo de lambda sin tipo. Estamos hablando más generalmente sobre combinadores de puntos fijos.

Todas las respuestas dadas aquí muestran excelentemente por qué los combinadores de puntos fijos realmente no tienen sentido sin curarse. El dado por Lukazoid no es tan general como debería ser. Tiene este tipo (en la notación de Haskell):

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

Un combinador de punto fijo real debería ser mucho más polimórfico.

fix :: (a -> a) -> a
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top