我有一个问题要问我“二次方程”和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))
能帮我解决我的错误吗?
答案 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 :: ?? -> ?? -> ?? -> ??
那应该是什么?