D'un point de vue mathématique, votre signature n'est pas
test: <number, number> -> <number>
mais
test: <environment, number, number> -> <environment, number>
où le environment
est capable de fournir des résultats de Math.random()
. Et la génération de la valeur aléatoire a pour effet secondaire de faire muter l'environnement, de sorte que vous renvoyez également un nouvel environnement, qui n'est pas égal au premier !
En d'autres termes, si vous avez besoin d'un type d'entrée qui ne provient pas des arguments initiaux (l'élément <number, number>
), vous devez disposer d'un environnement d'exécution (qui, dans cet exemple, fournit l'état pour les éléments suivants Math
). Il en va de même pour d'autres choses mentionnées dans d'autres réponses, comme les E/S ou autres.
Par analogie, vous pouvez également remarquer que c'est ainsi que la programmation orientée objet peut être représentée - si nous disons, par exemple, que
SomeClass something
T result = something.foo(x, y)
alors en fait nous utilisons
foo: <something: SomeClass, x: Object, y: Object> -> <SomeClass, T>
l'objet dont la méthode est invoquée faisant partie de l'environnement. Et pourquoi le SomeClass
partie du résultat ? Parce que something
L'état de l'entreprise pourrait également avoir changé !