Y a-t-il un langage de programmation (ou un système de type) de programmation dans lequel vous pourriez exprimer les fonctions de python suivantes de manière statique et sécurisée de type (sans avoir à utiliser des moulages, des contrôles d'exécution, etc.)?
# 1 code>: p> # 2 code>: p>
3 Réponses :
En ce qui concerne l'exemple n ° 1, vous devez spécifier le type de retour de Apply (), puis toutes les fonctions X que vous avez laissées également le renvoyer. La plupart des langues typées statiquement ne seraient pas en mesure de le faire en toute sécurité sans chèques, car la fonction X que vous passez peut renvoyer tout. P>
Dans l'exemple n ° 2, le type des objets d'itérateur est qu'ils sont des itérateurs. Si vous voulez dire ce qu'ils reviennent, ils renvoient des itérateurs. Je ne vois pas pourquoi cela ne serait pas possible dans un système statique, mais peut-être que je manque quelque chose. P>
Les itérateurs sont également génériques car vous devez connaître le type de valeur qu'il contient (itérateur
contient? Pourquoi? Vous devez savoir ce qu'ils reviennent et, dans ce cas, ils retournent un autre itérateur.
Attendez, vous voulez dire que nous ne pouvons pas être sûrs que l'itérateur, l'itérateur revienne retourne un itérateur, et c'est vrai. En bref, non, dans une langue statique, si vous utilisez des fonctions génériques et les transmettez-les, alors non, vous ne savez pas ce qu'ils reviennent. En fait, c'est typiquement quelque chose que vous faites dans une langue statique lorsque vous avez besoin de fonctionnalités dynamiques. ;)
Cependant, comme vous l'avez démontré, il existe un type spécifique pour X qui permet de saisir la fonction: p> apply :: (t -> B) -> B
Pour # 2: Pourriez-vous donner un exemple concret? Je pense que l'on mettra en œuvre cela à Haskell de manière très différente (monads / continités), mais ne saisirait pas que les itérateurs soient le même problème que dans la n ° 1?
J'ai trouvé une solution Haskell pour # 1 fort> en utilisant Rank-N -Types (juste pour GHCI) {-# LANGUAGE RankNTypes #-}
apply :: (forall a . a -> r) -> r
apply x = x x
apply $ const 42 -- Yields 42
Non! Pourquoi penses-tu ça?
Ceux-ci devraient être dans deux questions distinctes. Les conséquences d'entre eux étant dans la même question sont évidentes, comme la plupart des réponses ci-dessous s'attaquent, mais pas les deux. Par conséquent, la fermeture de trop large i>.
Go devrait être capable de le faire. Java8 aussi, IIRC.