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

时间:2017-04-03 15:21:30

标签: haskell

我见过的所有其他平均问题都比我需要的要复杂得多。我是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 个答案:

答案 0 :(得分:1)

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

fromIntegral (a + b + c) / 3

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

(/) :: Fractional a => a -> a -> a,表示/取两个相同类型的小数,并返回相同类型的小数。你给它一个Int作为参数,它不是小数,并要求Float作为输出。在将Int提交给Float之前,您必须将/转换为fromIntegral :: Int -> Float。使用fromIntegral (a + b + c) / 3<?php ini_set("display_errors", 1); $json='{ "2007":{ "number-xx" : "5", "number-aa" : "30", "number-ef" : "2", "number-sa" : "-10", "number-ab" : "28" }, "2008":{ "number-xx" : "-1", "number-aa" : "0.5", "number-ef" : "23", "number-sa" : "55", "number-ab" : "43" } }'; $data=json_decode($json,true); $result=array(); foreach($data as $key=>$nodeData) { asort($nodeData); $result[$key]= $nodeData; } print_r($result); 。您也可以省略类型签名并向ghci询问推断类型。