如何使用haskell创建三角形区域

Chr*_*nan -1 haskell

你好我只想问一下如何在Haskell中创建一个矩形区域.这是我的代码

main = do
putStrLn"Enter base"
base <- getLine
putStrLn"Enter height"
height <- getLine
putStrLn("The area is: " ++ (height * base) /2)
Run Code Online (Sandbox Code Playgroud)

错误在声明中:

putStrLn("The area is : " ++(height *base) /2) 
Run Code Online (Sandbox Code Playgroud)

And*_*ewC 9

首先,你应该在a之后缩进do,并在函数和它们的参数之间使用空格.

main = do
    putStrLn "Enter base"
    base <- getLine
    putStrLn "Enter height"
    height <- getLine
    putStrLn ("The area is: " ++  show ((read height * read base) /2))
Run Code Online (Sandbox Code Playgroud)

主要问题是在Haskell中,数据不会在类型之间自动转换,因此您无法对字符串进行数值运算,并且必须明确您想要的内容.

(这种类型的编译时检查消除了很多错误来源 - 最好尽早发现问题,即使它最初看起来很挑剔.)

我们需要readString来创建一个数字,然后show将结果转回String,这就是我们需要的原因show ((read height * read base) /2)

顺便说一句,这似乎是计算三角形的面积而不是矩形!

改进 - 纯粹的代码

如果您将主要功能 - 三角形计算 - 与IO分开,那么您的代码会更好,所以写作

triangle base height = height * base / 2

main = do
    putStrLn "Enter base"
    base <- readLn      -- readLn is handy
    putStrLn "Enter height"
    height <- readLn
    putStr "The area is: "
    print (triangle base height)  -- print is also handy
Run Code Online (Sandbox Code Playgroud)

readLn做了getLine然后使用read上的结果.
print是的show,然后putStrLn.
我使用过putStr哪个不会使用更少的括号开始换行!

  • @rogaos确实 - 非常好的做法.我刚刚跳过了Num Typeclass_位的_Introduction. (2认同)
  • 您还可以执行`print $ triangle base height`来保存括号. (2认同)