1

Je cherche à apprendre J et le livre que je me sers dit que c'est la bonne façon de définir une fonction monadiquePourquoi cette fonction J ne fonctionne-t-elle pas?

 
function =: 3:0 
    function statements 

alors j'ai suivi ce format et écrit le code de pliage. Pouvez-vous me dire pourquoi cela est de lancer une erreur de syntaxe lorsque je tente de l'appeler avec entrée, mais si je viens d'appeler p il retourne 3

h=:>:@[email protected]<[email protected]: :[: NB. gets all integers less than half of the input :[: forces error if used dyadicly 
d=:(0&=|)~ h :[: NB. gets list where if one is set that index from h was a factor of the input y :[: forces error if used dyadicly 
p=: 3:0 NB. tells us p is a monadic function 
    t =: d y 
    a =: i. 1 
    while. 1<#t 
     if. t~:0 
     a =: a, #t 
     end. 
     t=: _1 }. t NB. found first mistake wrong bracket but fixing that doesn't fix it 
    end. 
    a*1 
) 

NB. p gets a list of all integers that are factors of y 
p 4 
| syntax error 
| p 4 
p 
3 
NB. h and d run fine 
h 4 
    1 2 
h 7 
    1 2 3 
d 7 
    1 0 0 
d 4 
    1 1 
+0

J n'est pas un langage de programmation fonctionnel. C'est un langage de programmation au niveau de la fonction. (Voir l'article Wikipedia sur la programmation au niveau de la fonction pour une discussion de la différence.) –

Répondre

2

Tout d'abord, 3:0 parse comme (3:) (0), à savoir la monade "3:" appliquée au nom "0". Ce n'est pas ce que tu veux; pour les définitions, vous voulez utiliser le dyad ":", vous devez donc le séparer du 3 avec un espace.

Deuxièmement, vous devez utiliser =. au lieu de =: dans la définition, car t et a sont des variables locales.

Plusieurs parties peuvent être simplifiées:

d =: 0 = h | [    NB. does h y divide y 
p =: d # h     NB. select d y from h y 

fonctionnalité même que précédemment, mais plus claire et plus rapide.

+0

ah merci je suis nouveau à la programmation fonctionnelle et très nouveau à J il m'a fallu assez longtemps pour arriver à quelque chose qui a fait ce que je voulais pensé qu'il y avait un moyen plus rapide. La [monade est l'auto monade droite? –

+0

J prend en charge la "programmation au niveau de la fonction", mais ne prend pas en charge la "programmation fonctionnelle". Dans le contexte monadique, '[' est une fonction d'identité (renvoie l'argument). Dans un contexte dyadique, il renvoie 'x' et ignore' y' (renvoie l'argument de gauche). Les définitions que je donne ici utilisent des crochets et des fourches pour combiner les verbes en nouveaux verbes. – ephemient

0

I figured it out genre de je reçois une erreur de pile au lieu d'une syntaxe erreur avec monad définir au lieu d'utiliser 3: 0. Je dois encore travailler quelques kinks mais je progresse.

h =:>:@[email protected]<[email protected]: 
d =:(0&[email protected]|)~ h 
p =: monad define 
t =: d y 
a =: i.0 
while. 1<#t do. 
    if. {:t~:0 do. 
     a=:a, #t 
    end. 
    t=: _1 }. t 
end. 
a 
) 

ma dernière tentative est une bonne affaire proche d'obtenir une erreur de valeur maintenant. Je ne sais toujours pas pourquoi son échec mais je l'aurai bientôt. Je me suis rendu compte que j'oubliais le faire. après les conditionnels en leur ajoutant tout fixe.

Questions connexes