Pourquoi Clojure, malgré un tel accent mis sur le paradigme fonctionnel, n'utilise-t-il pas la monade Maybe
/ Option
pour représenter des valeurs facultatives? L'utilisation de Option
est assez répandue dans Scala, un langage de programmation fonctionnel que j'utilise régulièrement.
Réponses
Trop de publicités?Clojure est pas statiquement typé, donc n'a pas besoin de la stricte ce/qui/quel que soit le type de déclarations qui sont nécessaires en haskell (et, je crois, la Scala). Si vous voulez retourner une chaîne de caractères, vous retourner une chaîne de caractères; si vous retourner nil au lieu de cela, c'est bien aussi.
"Fonctionnel" ne correspond pas exactement à la "stricte au moment de la compilation en tapant". Ils sont orthogonaux concepts, et Clojure choisit typage dynamique. En fait, depuis un moment je ne pouvais pas imaginer comment vous pourriez mettre en œuvre nombre de fonctions d'ordre supérieur, comme map
et de préserver le typage statique. Maintenant que j'ai un peu (très peu) d'expérience avec Haskell, je peux voir qu'il est possible, et d'ailleurs souvent assez élégant. Je pense que si vous jouez avec Clojure pour un certain temps, vous aurez l'expérience inverse: vous vous rendrez compte que le type de déclarations ne sont pas nécessaire pour vous donner le genre de pouvoir que vous avez l'habitude d'avoir dans un langage fonctionnel.
En Clojure, nul beaucoup les jeux de mots fournit la plupart des fonctionnalités que la Scala & Haskell obtenir de l'Option & Peut-être.
**Scala** **Clojure**
Some(1) map (2+_) (if-let [a 1] (+ 2 a))
Some(1) match { (if-let [a 1]
case Some(x) => 2+x (+ 2 a)
case None => 4 4)
}
Scala Option & Haskell sont Peut-être les deux cas, des Applicatifs. Cela signifie que vous pouvez utiliser les valeurs de ces types d'interprétations. Par exemple, Scala prend en charge:
for { a <- Some(1)
b <- Some(2)
} yield a + b
Clojure est pour la macro fournit des compréhensions plus de seq. Contrairement à monadique interprétations, cette mise en œuvre permet de mélanger les types d'instance.
Si Clojure pour ne peut pas être utilisé pour la composition de fonctions sur plusieurs néant valeurs, c'est la fonctionnalité qui est trivial à mettre en œuvre.
(defn appun [f & ms]
(when (every? some? ms)
(apply f ms)))
Et en l'appelant:
(appun + 1 2 3) #_=> 6
(appun + 1 2 nil) #_=> nil
Peut-être/Option est un type. Il n'a rien à voir avec de la programmation fonctionnelle. Oui, certaines langues (Scala, haskell, ocaml) en plus d'être fonctionnels fournissent également un très puissant système de type. Les gens disent même sur haskell que c'est une programmation AVEC des TYPES.
D'autres (clojure, lisp) ne fournissent pas beaucoup en termes de types, même si elles sont tout à fait capables langages fonctionnels. Leur accent est différent, et Peut-être du type de l'Option ne rentre pas dans. Simplement, il ne vous donne pas beaucoup dans la dynamique de la langue. Par exemple, beaucoup de clojure fonctions opérant sur des séquences (listes, vecteurs, cartes) fera parfaitement l'accepter nulle (zéro) et la traiter comme structure vide.
(le comte néant) vous donne 0. Tout comme (le comte [])
Clojure ne peut pas être appelé une "programmation avec des types" et donc Peut-être que le type n'a pas beaucoup de sens en elle.
Il y a bien une monade Peut-être, mais il utilise néant Rien, la capture seulement l'abstraction de calcul (si entrée=nil retour néant d'autre calc que ce soit avec entrée)pour éviter les pointeurs null erreurs, mais il n'a pas le statique au moment de la compilation de la sécurité. Il est fnil trop qui ont une mission similaire, l'application de correctifs nul avec les valeurs par défaut et un -?>. Je pense que le clojure moyen est plus orienté pour le retour des valeurs par défaut qui soulèvent des erreurs ou nul.
Va avec @amalloy et les commentaires que Clojure, comme une langue, n'a pas besoin d'une option de valeur de retour.
Je n'ai pas fait beaucoup avec Scala, mais Clojure n'a pas besoin de connaître le strict détails sur le type de retour pour être en mesure de travailler avec une valeur. C'est presque comme si un Peut-être monade a été incorporé et fait partie de la normale Clojure d'évaluation, comme beaucoup d'opérations, si elle est effectuée sur nil
, rendement nil
.
J'ai pris un coup d'oeil rapide à la Clojure-Contrib bibliothèque, et ils ont une monade package que vous souhaitez regarder. Un autre élément qui a vraiment doué moi dans la façon dont on pourrait faire usage de Monades en Clojure, est Cosmin de tutoriel sur les Monades en Clojure. C'était ce que m'aider à me connecter comment la fonctionnalité qui est dit plus explicitement dans la Scala est traitée dans le cadre de la dynamique de Clojure langue.