【问题标题】:Simple Haskell Average Function Gives Couldn't Match Type Error简单的 Haskell 平均函数给出无法匹配类型错误
【发布时间】:2017-04-03 15:21:30
【问题描述】:

我见过的所有其他普通问题都比我需要的要复杂得多。我对 Haskell 很陌生,目前正在阅读 The Craft of Functional Programming 第 2 版。

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

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

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

    表达式a + b + c 将具有Int 类型,而/ 甚至没有为Int 定义。 GHC 可能会推断出 3 的类型为 Float。在这种情况下,您必须显式转换类型,因此您需要这样做

    fromIntegral (a + b + c) / 3
    

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

    【讨论】:

      【解决方案2】:

      你应该使用Fractional,支持Real除法:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-05-13
          • 1970-01-01
          • 2020-09-05
          • 2016-05-01
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多