Haskell如何显示函数结果

时间:2018-10-14 03:44:31

标签: haskell

我有一个问题要问我“二次方程”和show的结果并加上根数

示例:

Main> quadratric 2 2 2
2x^2 + 2x + 2 = 0
Has no real roots.

Main> quadratic 2 5 2
2x^2 + 5x + 2 = 0
Has two real roots:
-2.0 and -0.5

这是二次方程:

quadraticprob a b c
       | root < 0  = error "Has no real roots"
       | root == 0 = [-b/(2*a)]
       | root > 0  = [-b/(2*a) + sqroot/(2*a),
                             -b/(2*a) - sqroot/(2*a)]
       where
           root = b*b - 4*a*c
           sqroot = sqrt root

我可以得到结果,但是我应该加上它们具有多少个根,所以我应该再使用一个getLine函数并显示结果。

我做了这个,但这是完全错误的:

readresult :: IO ()
readresult = do
      line <- getLine 
      putStrLn (show (quadraticprob (read line))

能帮我解决我的错误吗?

2 个答案:

答案 0 :(得分:2)

假设您要一次从标准输入调用“ getLine”函数获取3个整数。

表达式

line <- getLine

将返回类似(例如)的字符串

"2 2 2"

每个整数之间带有空格。首先要做的是删除空格并将其从字符串转换为Int类型。 单词 read 功能可以轻松解决以下问题:

map read (words line)::[Int]

但是,整数列表不能直接传递给二次函数,它需要使用 case 从列表中获取元素

case map read (words line)::[Int] of 
     [a, b, c] -> putStrLn $ show $ quadraticprob a b c

如果要读取实数而不是整数,只需将map .. :: [Int]更改为:: [Double]。

答案 1 :(得分:0)

一些提示:

为每个参数使用getLine

... = do
   astr <- getLine
   bstr <- getLine
   cstr <- getLine
   putStrLn (show (quadraticprob (read astr) (read bstr) (read cstr)))

对于quadraticprob,目前尚不清楚您的目标是什么。在编写任何代码之前,应先编写所需的类型。

quadraticprob :: ?? -> ?? -> ?? -> ??

那应该是什么?