2

任何人都可以帮助我吗?我正在尝试编写一个函数来检查 x 是否为奇数,而不使用奇数函数。像这样它不起作用,但我不知道为什么。

   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 .. ]
4

1 回答 1

4

问题出在一线

x elem oddList

应该说

elem x oddList

因为elem是一个函数elem :: Eq a => a -> [a] -> Bool,或者

x `elem` oddList

您在哪里使用反引号来指示中缀函数应用程序。


请注意,您的功能无法按预期工作。对于奇数,它最终会返回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..])
于 2016-04-13T09:25:15.630 回答