ОК, поэтому я пытаюсь реализовать basics of lambda calculus. Вот оно.лямбда-исчисление в scala
Мои номера:
def zero[Z](s: Z => Z)(z: Z): Z = z
def one[Z](s: Z => Z)(z: Z): Z = s(z)
def two[Z](s: Z => Z)(z: Z): Z = s(s(z))
Частично (на самом деле, не) применяется вариант них то вроде этого:
def z[Z]: (Z => Z) => (Z => Z) = zero _
Прежде чем продолжить, я определить некоторые типы:
type FZ[Z] = Z => Z
type FFZ[Z] = FZ[Z] => FZ[Z]
Изобразительное, succ
функция идет как (заказ заявки должен быть ровно вот так! Я принял определение here):
def succ[Z](w: FFZ[Z])(y: FZ[Z])(x: Z): Z = y((w(y))(x))
И Непримененную версию этого становится так страшно, как:
def s[Z]: FFFZ[Z] = successor _
Просит прощения, вот недостающие типы:
type FFFZ[Z] = FFZ[Z] => FFZ[Z]
type FFFFZ[Z] = FFFZ[Z] => FFFZ[Z]
Но Я застрял в функции add
. Если соответствовали типам и определения (взятая here а) он идет как
def add[Z](a: FFFFZ[Z])(b: FFZ[Z]): FFZ[Z] =
(a(s))(b)
Но я хочу a
быть общее число типа FFZ[Z]
.
Так как я могу определить дополнение?
Моя первая догадка, что он работает только для нетипизированного лямбда-исчисления, где значение просто * somehting *, а функция - это отображение от * something * к * something *, поэтому я могу вызвать функцию 'f', тип аргумента которой, скажем,' a: Z -> Z', и это может не соответствовать точно t o функция 'f ': (Z -> Z) -> (Z -> Z)' Я применяю ее. – zapadlo
Возможно, название «Дополнение для церковных цифр в Скале» было бы более точным. –