2017-08-02 2 views
3

Je me heurte à ce qui ressemble à du code invalide généré par Happy. Le problème se résume à GHC ne déduisant pas une signature de type polykinded pour une fonction. Voici un exemple de ceci:GHC ne peut pas déduire kind non

{-# Language MagicHash #-} 

f x =() 

main = pure (f 1#) 

Depuis GHC infère f :: a ->()a :: *, cela ne fonctionne pas avec

• Couldn't match a lifted type with an unlifted type 
    When matching the kind of ‘GHC.Prim.Int#’ 
• In the first argument of ‘f’, namely ‘1#’ 
    In the first argument of ‘pure’, namely ‘(f 1#)’ 
    In the expression: pure (f 1#) 

Y a-t-il des pragmas de langue que je pouvais tourner à obtenir ce code pour compiler? Je sais que je pourrais théoriquement ajouter simplement des signatures de type mais, comme c'est un code généré par Happy, que je préférerais ne pas devoir modifier manuellement.

+0

Cela semble pertinent: https://stackoverflow.com/a/35320729/180286. Fondamentalement, une fonction ne peut pas être polymorphe sur les types, à moins que vous ne le vouliez vraiment, et seulement dans GHC 8+ –

+2

Si Happy génère du code qui ne compile pas de cette façon, c'est probablement un bug dans Happy (peut-être un qui peut être travaillé autour!). Pouvez-vous mettre en place un exemple Happy minimal qui produit un tel code? Je ne pense pas que GHC infère jamais un type autre que '*' pour un polytype. – user2407038

+0

@ user2407038 Bien que ma question soit toujours, ce bug particulier Happy est facilement corrigé. Fondamentalement tout code généré qui utilise 'happyMonad2Reduce' et qui n'a pas été généré avec' -a' aura ce problème pour la variable 'nt :: Int #' (qui n'est pas utilisée sans '-a', d'où les problèmes d'inférence de type). Je suis actuellement en train de me battre contre des problèmes plus heureux, donc le dépôt d'un problème pour _this_ est en veilleuse. :) – Alec

Répondre

1

Comme l'indique @dfeuer, cela est impossible. Dans le pire des cas, GHC devrait rechercher les usages d'une fonction donnée dans l'ensemble du projet afin de déduire la légèreté d'un argument.

Ceci a été signalé comme bug in Happy et a depuis été fixed.