2017-09-24 66 views
0

我对Haskell很新,我正在尝试做一个基本的函数,它可以找到列表的意思。我几乎已经解决了,除了我必须做的最后一部分。Haskell中的两个函数的划分

randInts = take 5 $ randoms (mkStdGen 11) :: [Int] 

listSum :: (Num a) => [a] -> a 
listSum [] = 0 
listSum (x:xs) = x + listSum xs 

listLength :: (Num a) => [a] -> a 
listLength [] = 0 
listLength (x:xs) = 1 + listLength xs 

listMean :: (Num a) => [a] -> a 
listMean [] = 0 
listMean x = (listSum x)/(listLength x) 

这是我开始,其中listSum和listLength基本上具有相同的功能之和长度上的运营商名单分别listMean需要这两个和将其划分。当我运行这一点,但是,我得到一个错误说“无法演绎(分数一)从使用‘/’从上下文的产生:民为”

起初,我只是觉得我用了错误的类型和切换listmean以listMean ::(分数a)=> [a] - > a开头。这允许我编译,但是当我试图通过给它randInts运行它时,但是我得到错误消息“没有使用'listMean'引发的(Fractional Int)实例。”

我不知道我在这里失踪。请给我一些建议吗?

+0

您的意思是删除小数?我做到了这一点,它给了我一个错误,说“预期的类型,但'一'有种'约束'” –

+0

这给了我错误“没有实例(分数INT)由于使用'listMean'” –

回答

2

在猜测:你正在测试这与ghci listMean randInts。这是一个问题,因为Int不支持通过(/)进行划分,而是支持通过div进行整数划分(以避免某种类型的错误在混淆两者的语言中出现)。

你有两个明显的选择,即,将您Int s到的东西,不支持部门(如Double)或随机生成Double S IN首位。

listMean (map fromIntegral is) :: Double 
listMean . take 5 . randoms $ mkStdGen 11 :: Double 

顺便说一句,如果我的猜测是正确的:在未来,你真的应该包括所有的,你做的事情,我们一起在家里玩能跟着他们的详细信息,在这么多的细节和看到完全相同的错误; 你应该包括错误的全部内容,特别是因为在这种情况下,它提到了导致它的代码片段,并且会使诊断瞬时完成。

+0

我没有想过用float来测试它,我发现它现在可以和float值一起工作。感谢您的建议(尽管现在我无法让解释器将int转换为float) –

1

的问题是:

(Num a) => [a] -> a 

施加[Int],既listSumlistLength回报Int,不支持/。您需要在除法之前转换返回值:

listMean :: (Num a, Integral a) => [a] -> Double 
listMean [] = 0 
listMean x = (fromIntegral $ listSum x)/(fromIntegral $ listLength x)