以下代码运行,但我不确定为什么类型签名需要浮点数。
farenheitToCelcius :: Float -> Float
farenheitToCelcius farenheit = (5/9)*(farenheit-32)
main :: IO()
main = print (show (farenheitToCelcius 67))
以下类型签名:
farenheitToCelcius :: Int-> Float
farenheitToCelcius farenheit = (5/9)*(farenheit-32)
main :: IO()
main = print (show (farenheitToCelcius 67))
导致此错误?:
main.hs:2:32: error:
• Couldn't match expected type ‘Float’ with actual type ‘Int’
• In the expression: (5 / 9) * (farenheit - 32)
In an equation for ‘farenheitToCelcius’:
farenheitToCelcius farenheit = (5 / 9) * (farenheit - 32)
<interactive>:3:1: error:
• Variable not in scope: main
• Perhaps you meant ‘min’ (imported from Prelude)
我正在使用repl.it。
答案 0 :(得分:1)
这里的问题是*
,+
和/
等数值操作仅针对相同数字类型的操作定义 - 即,如果您有x + y
然后x
和y
都需要具有相同的类型,结果将再次具有相同的类型。您可以使用fromIntegral
函数将类似整数的类型转换为任何其他数字类型,因此如果您希望函数的类型为Int -> Float
,则只需在此处添加:
farenheitToCelcius :: Int-> Float
farenheitToCelcius farenheit = (5/9)*(fromIntegral farenheit-32)
另请注意,/
运算符不为整数定义(对于整数除法,您需要使用div
函数),所以如果您希望这是类型为Int -> Int
的函数还有其他一些您需要在此处执行的操作。