Qu'est-ce que le langage OCaml équivalent en Python de la portée de la fonction?
Je veux créer une liste de nombres entiers de 1 à n. Je peux le faire en Python à l'aide de range(1, n+1), et en Haskell utilisation: prendre la n (iterate (1+) 1).
Qu'est-ce que le droit OCaml idiome pour cela?
- Le Haskell syntaxe sera:
[1..n]
.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de langage que je connais, mais ici, c'est assez naturel de définition à l'aide d'un opérateur infixe:
Sinon, le interprétations de la syntaxe de l'extension (qui donne la syntaxe
[i .. j]
pour le ci-dessus) est susceptible d'être inclus dans une future version de la la "communauté" version d'OCaml, de sorte que peut devenir idiomatiques. Je ne vous recommande pas de commencer à jouer avec la syntaxe des extensions si vous êtes nouveau à la langue, mais.--
opérateur est mis en œuvre dans les Piles Inclus, mais il produit un enum, plutôt qu'une liste.Avec Piles Incluses, vous pouvez écrire
La
--
opérateur génère une énumération à partir de la première valeur à la seconde. Le--^
opérateur est similaire, mais énumère un demi-intervalle ouvert (1--^10
énumérer de 1 à 9).Ici, vous allez:
Noter que ce n'est pas la queue-récursive. Moderne les versions de Python ont même un paresseux gamme.
Cela fonctionne dans la base de OCaml:
# List.init 5 (fun x -> x + 1);;
- : int list = [1; 2; 3; 4; 5]
List.init
est disponible à partir de OCaml 4.06.0.OCaml a une syntaxe spéciale pour le filtrage sur les plages:
Pour créer une plage, vous pouvez utiliser
Base
:Si vous utilisez
open Batteries
(qui est une version communautaire de la bibliothèque standard), vous pouvez le fairerange(1,n+1)
parList.range 1 `To n
(avis le backquote avantTo
).Une manière plus générale (également besoin de piles) est d'utiliser
List.init n f
qui renvoie une liste contenant (f 0) (f 1) ... (f (n-1)).Un peu tard pour le jeu ici, mais voici mon oeuvre:
Vous pouvez alors l'utiliser très semblable à la fonction python:
naturellement, je pense que la meilleure réponse est tout simplement de l'utilisation de Base, mais c'est peut-être mieux si vous avez seulement besoin d'une fonction et que vous êtes en essayant d'éviter le plein cadre.
BTW, en Haskell vous préférez utiliser les
Ce sont juste inutiles.
Suivantes sur Alex Coventry ci-dessus, mais encore plus courte.
Si vous n'avez pas besoin d'une "étape" de paramètre, un moyen facile de mettre en œuvre cette fonction serait:
let range start stop = List.init (abs @@ stop - start) (fun i -> i + start)
Venu avec cette: