2016-04-13 5 views
2

Quelqu'un peut-il m'aider avec cela? J'essaye d'écrire une fonction vérifiant si un x est impair, sans utiliser la fonction impaire. Comme ça ça ne marche pas mais je ne sais pas pourquoi.Fonction Haskell vérifiant si le nombre est impair, sans utiliser la fonction impaire

ugerade :: Integral a => a -> Bool 
    ugerade x 
    |x elem oddList = True 
    |otherwise = False 
    where 
    oddList=[x | x<-[1,3..]] 

Erreur

Could not deduce (Num t0) arising from the literal ‘1’ 
from the context (Integral a) 
    bound by the type signature for ugerade :: Integral a => a -> Bool 
    at /Users/Mauritius/Desktop/Haskell/u02/2-2/funktionen.hs:24:11-33 
The type variable ‘t0’ is ambiguous 
Relevant bindings include 
    oddList :: [t0] 
    (bound at /Users/Mauritius/Desktop/Haskell/u02/2-2/funktionen.hs:29:4) 
Note: there are several potential instances: 
    instance Integral a => Num (GHC.Real.Ratio a) 
    -- Defined in ‘GHC.Real’ 
    instance Num Integer -- Defined in ‘GHC.Num’ 
    instance Num Double -- Defined in ‘GHC.Float’ 
    ...plus three others 
In the expression: 1 
In the expression: [1, 3 .. ] 
In a stmt of a list comprehension: x <- [1, 3 .. ] 
+0

est-modulo interdit aussi? –

+0

non ce n'est pas. mais je voulais le faire avec une compréhension de liste. Je ne comprends pas l'erreur – Mauritius

+0

'pas. même? :-) Plus dans l'esprit de votre effort jusqu'à présent serait 'ungerade x = Data.Maybe.fromJust (lookup x (zip [1 ..] (cycle [Vrai, Faux])))' qui se termine au moins pour positif 'x'. – yatima2975

Répondre

4

Le problème est dans la ligne

x elem oddList 

qui devrait soit dire

elem x oddList 

depuis elem est une fonction elem :: Eq a => a -> [a] -> Bool, ou 012 Où vous utilisez des guillemets pour indiquer l'application de la fonction infix.


Notez que votre fonction ne fonctionne pas comme prévu. Pour les nombres impairs il finira par retourner True (bien que cela prenne beaucoup de temps pour les gros arguments) mais pour les nombres pairs il ne reviendra jamais, car la fonction ne peut pas prouver qu'un nombre pair n'est jamais dans la liste oddList.

Notez également que l'écriture

oddList = [ x | x <- [1,3..] ] 

est redondant, vous pouvez simplement écrire

oddList = [1,3..] 

à la place, et l'écriture aussi

f x | x `elem` oddList = True 
    | otherwise  = False 

est redondant, où vous pouvez simplement écrire

f x = x `elem` oddList 

ou même

f x = x `elem` [1,3..] 

ou

f = (`elem` [1,3..]) 
+1

merci. Ça marche! Au moins aucune erreur, mais il ne se termine pas non plus – Mauritius

+1

juste réalisé .. il va chercher la liste pour toujours – Mauritius