Вопрос

Я попытался определить генератор с фиксированной точкой в 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 или этом операторе.Но я прочитал статью Мадса Торгерсена о реализации комбинатора Y / Fix с использованием лямбда-выражений C #.Это может быть вам как-то полезно, вот Ссылка.

И вот последний метод, который он реализует:

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

Другие советы

Прежде всего, Y - комбинатор это конкретная реализация в нетипизированном лямбда-исчислении.Мы говорим в более общем плане о комбинаторах с фиксированной точкой.

Все приведенные здесь ответы превосходно показывают, почему комбинаторы с фиксированной точкой на самом деле не имеют смысла без каррирования.Тот, который дает Луказоид, не такой общий, каким он должен быть.Он имеет такой тип (в нотации Haskell):

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

Реальный комбинатор с фиксированной точкой должен быть гораздо более полиморфным.

fix :: (a -> a) -> a
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top