如何从命令行输入两个整数并返回平方和的平方根

时间:2019-07-05 00:36:55

标签: haskell

我正在尝试开始学习Haskell。我想从命令行输入两个数字,然后返回每个数字的平方和的平方根。这是毕达哥拉斯定理

当然,我想我会在某个地方找到一个示例,所以我可以全神贯注地接受一些输入,将输入传递给函数,返回它,然后将结果打印出来。试图通过这个简单的案例。 PHP / Javascript程序员,想学习函数式编程,因此就像我现在正在学习Martian一样。抱歉,这个问题是否被提出或太简单了。当然,我已经接近了,但是我不明白自己所缺少的。我知道sqrt会返回浮点数。

module Main where

hypotenuse a b = sqrt $ a * a + b * b
main :: IO ()
main = do
  input1 <- getLine
  input2 <- getLine
  let a = read input1 :: Int
  let b = read input2 :: Int
  print $ hypotenuse a b

这将返回错误:

  

没有因使用“斜边”而引起的(Floating Int)实例,   第10行,字符11

斜边的'h'在我的Atom编辑器IDE中突出显示。使用ghc-mod插件进行检查。

更新: @peers回答解决了我的问题...

感谢stackoverflow.com,这是我的第一个haskell程序https://github.com/jackrabbithanna/haskell-pythagorean-theorem

1 个答案:

答案 0 :(得分:6)

sqrt期望输入类型为Floating类,但是您提供了Int而不实例化Floating。 在ghci中,您可以看到sqrt:t sqrt的类型签名。是sqrt :: Floating a => a -> a
Int实现了几种类型类,如:info Int所示:

instance Eq Int -- Defined in ‘GHC.Classes’
instance Ord Int -- Defined in ‘GHC.Classes’
instance Show Int -- Defined in ‘GHC.Show’
instance Read Int -- Defined in ‘GHC.Read’
instance Enum Int -- Defined in ‘GHC.Enum’
instance Num Int -- Defined in ‘GHC.Num’
instance Real Int -- Defined in ‘GHC.Real’
instance Integral Int -- Defined in ‘GHC.Real’
instance Bounded Int -- Defined in ‘GHC.Enum’

但是Floating不在其中。
尝试将read设置为Double或将IntfromIntegral转换。

代码中的两种方式:

module Main where

hypotenuse a b = sqrt $ a * a + b * b
main :: IO ()
main = do
  input1 <- getLine
  input2 <- getLine
  let a = read input1 :: Double
  let b = read input2 :: Int
  print $ hypotenuse a (fromIntegral b)