Je veux savoir quel est le type exact de fonctions primitives dans les langages de programmation fonctionnels paresseux comme Haskell.Type de fonctions primitives dans l'évaluation paresseuse
Supposons que les thunks soient évalués sur des objets de forme normale de tête faible. Alors, quel devrait être le type de fonctions primitives dans des langages stricts comme C?
Mes suppositions sont:
primitive1 : (thunk, thunk, ...) -> thunk
primitive2 : (thunk, thunk, ...) -> object
Je pense que les fonctions primitives doivent être transmises thunks comme arguments parce qu'ils ne peuvent pas besoin certains d'entre eux. Mais, je ne sais pas s'ils doivent renvoyer un thunk ou objet évalué tandis que le dernier doit être enveloppé avec une fonction comme celle ci-dessous pour le rendre paresseux.
lazy : ((thunk, thunk, ...) -> object) -> ((thunk, thunk, ...) -> thunk)
Eh bien, il n'y a pas de réponse unique à cette question, car cela dépend de la mise en œuvre. En ghc, les opérations primitives ont des types primitifs, c'est-à-dire, les mêmes types qu'en C. Vous avez une opération séparée pour envelopper et déballer les types primitifs dans les thunk. – augustss
@augustss Que diriez-vous des expressions si et cas? Leurs primitifs doivent être passés directement aux thunks, je suppose. Ou sont-ils au curry? – raviqqe
Une expression if est traduite en une expression case. Et il n'y a pas de primitive pour le cas, il est traduit en code machine (abstrait) qui dépend du type. Simplifié, d'abord le scrutinee est évalué à WHNF, puis vous extrayez son numéro de constructeur et l'employez comme décalage dans une table de saut. Le code sur lequel vous sautez déballera les champs du constructeur et procédera à l'évaluation. – augustss