首页 文章

简单的Haskell平均函数无法匹配类型错误

提问于
浏览
0

我见过的所有其他平均问题都比我需要的要复杂得多 . 我是Haskell的新手,我目前正在通过The Craft of Functional Programming 2nd Edition .

在第3章中,练习编写一个简单函数来平均3个整数 . 提供了函数类型签名,我在我的解决方案中使用它 . 我写:

averageThree :: Int -> Int -> Int -> Float
averageThree a b c = (a + b + c) / 3

我使用ghci进行编译,当我尝试加载我的文件时,我得到“无法匹配预期类型 Float' with actual type Int'” . 我该如何解决这个错误?

3 回答

  • 1

    (/) :: Fractional a => a -> a -> a ,表示 / 采用相同类型的两个小数,并返回相同类型的小数 . 你给它一个 Int 作为参数,这不是小数,并要求 Float 作为输出 . 您必须将 Int 转换为 Float ,然后才能将其转换为 / . 使用 fromIntegral :: Int -> Float . fromIntegral (a + b + c) / 3 . 您也可以省略类型签名并向ghci询问推断类型 .

  • 1

    表达式 a + b + c 的类型为 Int/ 甚至没有为 Int 定义 . GHC可能会推断 3 的类型为 Float . 你必须在这种情况下明确地转换类型,所以你需要这样做

    fromIntegral (a + b + c) / 3
    

    fromIntegral 函数采用 Integral a => a 类型,如 IntInteger ,并将其转换为 Num b => b 类型,也可以是 IntIntegral ,或 FloatDoubleComplex Double ,甚至是自定义数字类型 .

  • 0

    您应该使用Fractional来支持Real分部:

    averageThree :: Fractional a => a -> a -> a -> a
    averageThree a b c = (a + b + c) / 3
    

相关问题