2016-04-13 6 views
2

Может ли кто-нибудь помочь мне с этим? Я пытаюсь написать функцию проверки, если x нечетно, без использования нечетной функции. Нравится это не работает, но я не знаю почему.Функция проверки Haskell, если число нечетное, без использования нечетной функции

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

Ошибка

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

ли по модулю запрещен, а? –

+0

нет нет. но я хотел сделать это со списком. я не ошибаюсь – Mauritius

+0

'нет. даже '? :-) Еще в духе ваших усилий до сих пор было бы «ungerade x = Data.Maybe.fromJust (поиск x (zip [1 ..] (цикл [True, False])))' который, по крайней мере, заканчивается для положительного 'x'. – yatima2975

ответ

4

Проблема заключается в линии

x elem oddList 

, которые должны либо сказать

elem x oddList 

, поскольку elem является функцией elem :: Eq a => a -> [a] -> Bool или

x `elem` oddList 

, где вы используете обратные ссылки для указания приложения функции infix.


Обратите внимание, что ваша функция не работает должным образом. Для нечетных чисел он в конечном итоге возвращает True (хотя для больших аргументов требуется много времени), но для четных чисел он никогда не вернется, потому что функция не может доказать, что четное число никогда не входит в список oddList.

Также обратите внимание, что написание

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

является излишним, вы могли бы просто написать

oddList = [1,3..] 

вместо этого, а также написание

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

является излишним, где вы могли бы просто написать

f x = x `elem` oddList 

или даже

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

или

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

спасибо. Это работает! По крайней мере, нет ошибки, но она не заканчивается либо – Mauritius

+1

только что реализована .. она будет искать список навсегда – Mauritius