为什么在输入“ x1”上出现解析错误?

时间:2019-09-21 13:35:53

标签: haskell

所以nroots是一个函数,它根据增量值返回多项式的根数。 然后,我创建了一个函数,该函数返回多项式根的实际值。如果nroots等于1,则roots返回一个包含1个项目的列表;如果nroots等于2,则返回具有2个itens的列表。 但是,当我尝试编译它时,总是出现错误:输入'x1'上的解析错误 这是我的代码:

module Main where
main = do putStrLn "Hello World"

nroots :: Int -> Int -> Int -> Int

nroots a b c = if delta > 0 then 2 
            else if delta == 0 then 1
            else 0
   where
     delta = b^2 - 4*a*c

roots :: Int -> Int -> Int -> [Double]
roots a b c = if n > 0 then [x1,x2]
           else if n ==0 then [x1]
           else []
 where
    n = nroots a b c
    delta = b^2 - 4*a*c
    x1 = (-b +sqrt(delta))/2*a
    x2 = (-b -sqrt(delta))/2*a

2 个答案:

答案 0 :(得分:2)

Haskell是 strong 的类型。这意味着它不会隐式将Int转换为Double。因此,您无法构造类似(-b + sqrt delta)/(2*a)的表达式。

您可以使用fromIntegral :: (Integral i, Num n) => i -> nInt转换为Double

roots :: Int -> Int -> Int -> [Double]
roots a b c = if delta > 0 then [x1,x2]
           else if delta == 0 then [x1]
           else []
 where
    delta = b*b - 4*a*c
    sqdelta = sqrt (fromIntegral delta)
    x1 = -0.5*(fromIntegral b + sqdelta) / fromIntegral a
    x2 = -0.5*(fromIntegral b - sqdelta)/ fromIntegral a

答案 1 :(得分:0)

您正在混合空格和制表符。 delta缩进两个标签,x1缩进一些空格。不要那样做。