我正在尝试开始学习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
答案 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
或将Int
与fromIntegral
转换。
代码中的两种方式:
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)