2010-05-19 31 views
2

Disons que j'ai l'expression J suivante:Comment définir une fonction monadique pour travailler sur une liste dans J?

# 3 ((|=0:)#]) 1+i.1000

Ce compte le nombre de nombres compris entre 1 et 1000 qui sont divisibles par 3. (maintenant, avant que quelqu'un signale qu'il ya un moyen plus facile de le faire , cette question est sur la syntaxe de J, et non mathématiques)

Disons que je définir une fonction monadique pour cela, comme suit:.

f =: monad define 
# y ((|=0:)#]) 1+i.1000 
)

Cela fonctionne très bien avec un seul argument, par exemple,

 f 4 
250 

Si je passe une liste, je reçois une erreur de longueur:

 f 1 2 3 
|length error: f

Maintenant, je comprends parfaitement pourquoi je reçois l'erreur de longueur . Lorsque vous remplacez la liste 1 2 3 pour l'argument y de la monade, vous obtenez:

# 1 2 3 ((|=0:)#]) 1+i.1000

Si vous savez quoi que ce soit au sujet de J, il est assez clair pourquoi l'erreur de longueur se produit. Donc, je n'ai pas besoin d'explication de cela.

Je veux définir la fonction telle que, lorsque je passe une liste, elle retourne une liste, par exemple,

 f 1 2 3 
1000 500 333

Comment puis-je (a) redéfinir cette fonction pour prendre une liste et retourner une liste ou (b) obtenir la fonction de travailler sur une liste telle quelle sans être redéfinie, peut-être en utilisant un adverbe ou une autre technique?

+1

Je viens de me rendre compte que la vraie réponse est 'f" 0] 1 2 3' utilisant la conjonction _rank_ (le superflu ']' m'empêche d'avoir à utiliser des parenthèses.) –

Répondre

1

Ceci est pour (b) cas:

([email protected]{. , $:@}.) ^: (0 < #) 1 2 3 
1000 500 333 
+0

Wow, je ne savais pas que vous pouviez dit '(0 <#)'! Je pensais que vous deviez dire '(0: <#)'. Assez cool –

+0

@Gregory Higley: Puisque les verbes dans J sont appliqués aux arguments de droite à gauche, '(0 <#) 1 2 3' est la même chose que '0 <(# 1 2 3)' ou '0 <# 1 2 3'.' (0: <#) 'que vous avez suggéré est une * fourche * nous parlions à propos de [ici] (http://stackoverflow.com/questions/2864835). Considérer aussi '3 * 5 + 2', il est évalué à' 21';) –

+2

Il est nécessaire de voir (0 <#) comme un La dernière version de J traite le nom dans l'expression comme un verbe, c'est un cas rare de sucre syntaxique dans J (verbe substantif) est interprété comme (nom"_ verbe) – kaleidic

1

Je recommande l'approche beaucoup plus simple de définir votre verbe comme rang zéro. Travailler avec le verbe que vous avez fourni, voici un moyen simple de le faire:

f =: monad define "0 
# y ((|=0:)#]) 1+i.1000 
) 

    f 1 2 3 
1000 500 333 

Le seul changement est le "0 ajouté après le mot « définir ».

+0

Connaître le comportement souhaité de la fonction facilite la décision de la définir comme rang 0. Cela étant dit, j'aurais simplement utilisé 'f every' ou' f '0'. – MPelletier