9
votes

Comment faire de ces fonctions dactylographiées de type-sécurité?

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 : xxx

# 2 : xxx


3 commentaires

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 .


Go devrait être capable de le faire. Java8 aussi, IIRC.


3 Réponses :


0
votes

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.

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.


3 commentaires

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. ;)



4
votes

1 # fort> Ceci n'est pas typle avec un type fini. Cela signifie que très peu (le cas échéant) les langages de programmation seront en mesure de taper cela.

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


1 commentaires

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?



2
votes

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


0 commentaires