【问题标题】:Haskell: Types don't matchHaskell:类型不匹配
【发布时间】:2011-10-18 09:04:25
【问题描述】:

我只是想写一个简单的函数来计算输入-Ints的平均值:

avg :: Int -> Int -> Int -> Float
avg x y z = (x+y+z)/3

当我交换签名时

avg :: Float -> Float -> Float -> Float

它工作正常,但使用上面的那个我收到以下错误消息:

无法将预期类型“Float”与实际类型“Int”匹配。

我必须使用第一个签名(仅接受 Ints)的哪些可能性?

【问题讨论】:

    标签: haskell signature


    【解决方案1】:

    使用fromIntegral 将Ints 转换为Floats:

    avg :: Int -> Int -> Int -> Float
    avg x y z = (fromIntegral x + fromIntegral y + fromIntegral z) / 3
    

    【讨论】:

      【解决方案2】:

      更短:

      avg :: Int -> Int -> Int -> Float
      avg x y z = (fromIntegral $ sum [x,y,z]) / 3.0
      

      或者您将其概括为Ints 的列表:

      avg :: [Int] -> Float
      avg xs = (fromIntegral $ sum xs) / (fromIntegral $ length xs)
      

      【讨论】:

      • x+y+z 不是比sum [x,y,z] 短吗?
      • 否,但 fromIntegral $ sum [x,y,z] 比 fromIntegral x + fromIntegral y + fromIntegral z 短。而且更容易概括...
      • 你的回答与我的问题不同。
      猜你喜欢
      • 2014-03-02
      • 1970-01-01
      • 2013-05-04
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2011-11-30
      • 1970-01-01
      相关资源
      最近更新 更多