2014-08-30 1 views
2

J'essaie d'utiliser des flèches et je suis confronté à un problème ennuyeux - je dois fournir des types explicites pour toutes les fonctions que j'ai implémentées. Si je fournis pas les sorties GHC une erreur commeInférence de type dans haskell et flèches

No instance for (Arrow a0) arising from a use of ‘...’ 
The type variable ‘a0’ is ambiguous 

Je peux fournir des types explicites, mais il est très ennuyeux, car chaque fois que je change une fonction, il est possible que je dois modifier manuellement les types de chaque fonction dépendait modifié.

Est-il possible de forcer ghc à déduire automatiquement les types de fonctions?

Trivial cas

import Control.Arrow 

ss = arr 

provoque

No instance for (Arrow a0) arising from a use of ‘arr’ 
    The type variable ‘a0’ is ambiguous 
    Relevant bindings include 
     ss :: (b -> c) -> a0 b c (bound at src/Main.hs:62:1) 
    Note: there are several potential instances: 
     instance Arrow Coroutine -- Defined at src/Main.hs:33:10 
     instance Arrow (->) -- Defined in ‘Control.Arrow’ 
     instance Monad m => Arrow (Kleisli m) -- Defined in ‘Control.Arrow’ 
    In the expression: arr 
    In an equation for ‘ss’: ss = arr 

alors que le code avec exactement la même sémantique

import Control.Arrow 

ss :: forall a b c. (Arrow a) => (b -> c) -> a b c 
ss = arr 

compile assez bien.

+0

Je suis sûr que cela doit être un doublon, mais je n'ai pas encore trouvé d'autre question qui a une erreur de type ambigu à partir de la restriction de monomorphisme. –

Répondre

3

chose la plus facile est de désactiver la restriction de monomorphisme - mettre ceci au début de votre fichier source:

{-# LANGUAGE NoMonomorphismRestriction #-} 

La raison de votre erreur est que, bien que Haskell peut déduire le type de ss bien, le monomorphisme La restriction requiert que dans les définitions de niveau supérieur d'une valeur, le type ne soit pas polymorphe sur une classe de type (par exemple, Arrow), sauf s'il existe une signature de type explicite.