我的haskell类型签名不代表该功能

时间:2018-02-21 09:53:02

标签: haskell

以下代码运行,但我不确定为什么类型签名需要浮点数。

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。

1 个答案:

答案 0 :(得分:1)

这里的问题是*+/等数值操作仅针对相同数字类型的操作定义 - 即,如果您有x + y然后xy都需要具有相同的类型,结果将再次具有相同的类型。您可以使用fromIntegral函数将类似整数的类型转换为任何其他数字类型,因此如果您希望函数的类型为Int -> Float,则只需在此处添加:

farenheitToCelcius :: Int-> Float
farenheitToCelcius farenheit = (5/9)*(fromIntegral farenheit-32)

另请注意,/运算符为整数定义(对于整数除法,您需要使用div函数),所以如果您希望这是类型为Int -> Int的函数还有其他一些您需要在此处执行的操作。