OK, donc j'essaie d'implémenter le basics of lambda calculus. Ici ça va.lambda calcul en scala
Mes numéros:
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))
partiellement (en fait, non) appliquée la version d'entre eux est lissée comme ça:
def z[Z]: (Z => Z) => (Z => Z) = zero _
Avant de poursuivre, je définir certains types:
type FZ[Z] = Z => Z
type FFZ[Z] = FZ[Z] => FZ[Z]
Fine, succ
fonctionne comme (l'ordre d'application doit être exactement comme ça! Je pris la définition here):
def succ[Z](w: FFZ[Z])(y: FZ[Z])(x: Z): Z = y((w(y))(x))
Et la version non appliquée, il devient aussi effrayant que:
def s[Z]: FFFZ[Z] = successor _
Je vous demande pardon, voici les types manquants:
type FFFZ[Z] = FFZ[Z] => FFZ[Z]
type FFFFZ[Z] = FFFZ[Z] => FFFZ[Z]
Mais Je suis bloqué à la fonction add
. Si vous conformez aux types et la définition (prise here aussi bien), il va comme
def add[Z](a: FFFFZ[Z])(b: FFZ[Z]): FFZ[Z] =
(a(s))(b)
Mais je veux a
d'être un numéro commun de type FFZ[Z]
. Alors, comment puis-je définir l'addition?
Ma première hypothèse est que cela fonctionne seulement pour le lambda-calcul non typé, où value est juste * somehting * et function est un mappage de * something * à * quelque chose * donc je peux invoquer la fonction 'f' dont le type d'argument est, disons,' a: Z -> Z' et peut-être pas exactement conforme t o une fonction 'f ': (Z -> Z) -> (Z -> Z)' Je l'applique à. – zapadlo
Peut-être qu'un titre comme "Addition for Church numbers in Scala" serait un peu plus précis. –