Я добавил бы понятие "Композиции классов по наследованию классов" (который получен на основании других ответов здесь). Тем путем "составленный" объект не заботится о внутренней структуре объекта, это зависит от - только его поведение, которое приводит к лучшей инкапсуляции и более легкой пригодности для обслуживания (тестирование, меньше деталей для заботы о). На языках, таких как C# и Java это часто крайне важно, так как нет никакого множественного наследования, таким образом, помогает, что ад графика наследования предотвращения u мог бы иметь.
«Функция, которая принимает функцию и второе значение и применяет функцию ноль раз к аргументу», конечно, не равна нулю. Это кодировка нуля. Когда вы имеете дело с простым лямбда-исчислением, вам нужно каким-то образом кодировать числа (а также другие примитивные типы), и для каждого из этих типов существует несколько требований. Например, одно требование для натуральных чисел - это умение прибавлять 1 к данному числу, а другое - способность отличать ноль от более крупных чисел (если вы хотите узнать больше, ищите «Арифметика Пеано»). Популярная кодировка, которую цитирует Дарио, дает вам две вещи: а также представляет собой целое число N функцией, которая что-то делает (закодированная как аргумент f
) N раз, что является своего рода естественным способом использования натуральных чисел.
Существуют и другие кодировки. которые возможны - например, как только вы можете представить списки, вы можете представить N как список из N элементов. У этих кодировок есть свои плюсы и минусы, но приведенная выше является наиболее популярной.
См. википедия :
0 ≡ λf.λx. x
1 ≡ λf.λx. f x
2 ≡ λf.λx. f (f x)
3 ≡ λf.λx. f (f (f x))
...
n ≡ λf.λx. fn x