2017-10-04 5 views
1

Quel est le problème que:Pourquoi ne peut pas fonctionner Haskell retourner une liste

partin a = [floor a, a-floor a] 

Erreur:

<interactive>:342:1: error: 
    • Ambiguous type variable ‘a0’ arising from a use of ‘print’ 
     prevents the constraint ‘(Show a0)’ from being solved. 
     Probable fix: use a type annotation to specify what ‘a0’ should be. 
     These potential instances exist: 
     instance Show Ordering -- Defined in ‘GHC.Show’ 
     instance Show Integer -- Defined in ‘GHC.Show’ 
     instance Show a => Show (Maybe a) -- Defined in ‘GHC.Show’ 
     ...plus 22 others 
     ...plus 16 instances involving out-of-scope types 
     (use -fprint-potential-instances to see them all) 
    • In a stmt of an interactive GHCi command: print it 
+4

Il s'agit d'imprimer quelque chose, mais vous ne montrez pas comment vous essayez d'imprimer quelque chose. S'il vous plaît montrer le reste de ce que vous faites. – dfeuer

+0

En fait, quand je fais "partie a = a - étage a" est également donner la même erreur. Le code est uniquement constitué de cette fonction –

+3

Il a juste tapé 'part something' à l'invite de GHCi, comme dans la ligne de signature" Dans une commande interactive de GHCi: 'print it'." – HTNW

Répondre

7

Je ne peux pas donner une réponse complète sans voir l'étendue de ce que vous faisons, mais voici un problème défini qui est presque certainement impliqué. Vous écrivez

partin a = [floor a, a-floor a] 

Le type de floor est

floor :: (RealFrac a, Integral b) => a -> b 

Le type de (-) est

(-) :: Num a => a -> a -> a 

Puisque vous utilisez a - floor a, vous forçons le type de a être une instance de tous les deux la RealFrac classe et la classe Integral. Cependant, il n'y a pas un tel type dans la bibliothèque standard (et cela n'a pas beaucoup de sens). En conséquence, GHC ne sera certainement pas en mesure de sélectionner le type pour vous à partir de sa collection très limitée de valeurs par défaut. Les choses pourraient travailler beaucoup mieux si vous utilisez

partin a = [fromIntegral (floor a), a - fromIntegral (floor a :: Int)] 

Mais notez que cela ne fait pas vraiment beaucoup de sens d'avoir une liste ici, puisque vous essayez de diviser un nombre en deux composantes de différentes les types. Vous pourriez être mieux avec

partin a = (floor a, a - fromIntegral (floor a :: Int))