L'un des arguments que j'ai entendu à l'encontre de langages fonctionnels est que seule la cession de codage est trop difficile, ou, au moins, nettement plus que "normal" de la programmation.
Mais la recherche par le biais de mon code, j'ai réalisé que je n'ai vraiment pas beaucoup (tout?) les profils d'utilisation qui ne peuvent pas être écrits aussi bien en utilisant un seul formulaire de cession, si vous écrivez dans un assez moderne de la langue.
Quels sont donc les cas d'utilisation pour des variables qui varient à l'intérieur d'un seul appel de leur portée? En gardant à l'esprit que les indices de boucles, paramètres, et d'autres de la portée lié valeurs qui varient entre les invocations ne sont pas des missions multiples dans ce cas (sauf si vous avez à modifier dans le corps pour une raison quelconque), et en supposant que vous écrivez dans quelque chose d'un assez loin au-dessus de l'assemblée niveau de langue, où vous pouvez écrire des choses comme
values.sum
ou (dans le cas où la somme n'est pas fourni)
function collection.sum --> inject(zero, function (v,t) --> t+v )
et
x = if a > b then a else b
ou
n = case s
/^\d*$/ : s.to_int
'' : 0
'*' : a.length
'?' : a.length.random
else fail "I don't know how many you want"
lorsque vous en avez besoin, et ont interprétations de la liste, la carte/recueillir, et ainsi de suite disponible.
Trouvez-vous que vous avez encore envie/besoin mutable variables dans un tel environnement, et, dans l'affirmative, à quelles fins?
Pour être clair, je ne suis pas à demander une récitation des objections à l'encontre de la SSA de la forme, mais plutôt des exemples concrets où ces objections s'appliquerait. Je suis à la recherche de morceaux de code qui sont clairs et concis avec des variables mutables et n'a pas pu être écrite sans eux.
Mes exemples préférés à ce jour (et le meilleur objection que j'attends d'eux):
-
Paul Johnson de Fisher-Yates algorithme de réponse, ce qui est assez solide lorsque vous incluez le big-O contraintes. Mais alors, que catulahoops points, le big-O problème n'est pas lié à la SSA question, mais plutôt d'avoir mutable types de données, et avec qui mettre de côté l'algorithme peut être écrit assez clairement dans l'afrique subsaharienne:
shuffle(Lst) -> array:to_list(shuffle(array:from_list(Lst), erlang:length(Lst) - 1)). shuffle(Array, 0) -> Array; shuffle(Array, N) -> K = random:uniform(N) - 1, Ek = array:get(K, Array), En = array:get(N, Array), shuffle(array:set(K, En, array:set(N, Ek, Array)), N-1).
-
jpalecek de la surface d'un polygone exemple:
def area(figure : List[Point]) : Float = { if(figure.empty) return 0 val last = figure(0) var first= figure(0) val ret = 0 for (pt <- figure) { ret+=crossprod(last - first, pt - first) last = pt } ret }
qui pourrait encore être écrit quelque chose comme:
def area(figure : List[Point]) : Float = { if figure.length < 3 0 else var a = figure(0) var b = figure(1) var c = figure(2) if figure.length == 3 magnitude(crossproduct(b-a,c-a)) else foldLeft((0,a,b))(figure.rest)) { ((t,a,b),c) => (t+area([a,b,c]),a,c) }
Ou, puisque certaines personnes objet de la densité de cette formulation, il pourrait être reformulée:
def area([]) = 0.0 # An empty figure has no area def area([_]) = 0.0 # ...nor does a point def area([_,_]) = 0.0 # ...or a line segment def area([a,b,c]) = # The area of a triangle can be found directly magnitude(crossproduct(b-a,c-a)) def area(figure) = # For larger figures, reduce to triangles and sum as_triangles(figure).collect(area).sum def as_triangles([]) = [] # No triangles without at least three points def as_triangles([_]) = [] def as_triangles([_,_]) = [] def as_triangles([a,b,c | rest) = [[a,b,c] | as_triangles([a,c | rest])]
La princesse est point à propos de la difficulté de la mise en œuvre de O(1) les files d'attente avec des structures immuables qui est intéressant (et peut fournir la base pour un exemple éloquent), mais comme l'a dit il est fondamentalement sur les transformations de la structure de données, et non pas directement sur l'affectation multiple question.
Je suis intrigué par le Crible d'Eratosthène réponse, mais pas convaincu. Le bon big-O, tirez autant de primes que vous le souhaitez générateur de donnée dans le document qu'il cite n'a pas l'air facile à mettre en œuvre correctement avec ou sans SSA.
Et bien, merci tout le monde pour essayer. Comme la plupart des réponses s'est avéré être soit 1) sur la base de données mutable structures, et non pas sur une seule affectation, et 2) dans la mesure où ils étaient sur le point d'attribution unique forme facilement contrés par des praticiens qualifiés dans l'art, je vais frapper la ligne de mes propos et / ou restructurer (peut-être l'avez dans la sauvegarde comme un sujet de discussion dans le cas, peu probable, je n'ai plus de mots avant que j'ai le temps).
Merci encore.