我见过的所有其他平均问题都比我需要的要复杂得多。我是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'”。如何解决此错误?
答案 0 :(得分:1)
表达式a + b + c
的类型为Int
,/
甚至没有定义Int
。 GHC可能会推断出3
的类型为Float
。你必须在这种情况下明确地转换类型,所以你需要做
fromIntegral (a + b + c) / 3
fromIntegral
函数采用Integral a => a
类似Int
或Integer
类型,并将其转换为Num b => b
类型,也可以是Int
类型}或Integral
,或Float
,Double
,Complex 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询问推断类型。