gpt4 book ai didi

algorithm - Pearson 相关系数与 Haskell 浮点型冲突

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:40 25 4
gpt4 key购买 nike

我正在尝试编写一个程序来加载 2 个文本文件,将这些文件中的数字转换为 2 个列表,然后计算这些列表之间的 PIL 逊相关。

pearson 函数只能接受 float ,所以我创建了一个名为 floatconvert 的函数来尝试解决这个问题,但没有成功。我收到一条错误消息“无法将预期类型‘IO b0’与实际类型‘Float’匹配。”在‘pearson’的第一个参数中,即‘input1.’”

如果您能帮助解决此问题,我们将不胜感激。

main = do
input1file <- readFile "input1.txt"
input2file <- readFile "input2.txt"

let input1 = floatconvert input1file
let input2 = floatconvert input2file

pearson input1 input2

floatconvert x = [ read a::Float | a <- words x ]

pearson xs ys = (psum-(sumX*sumY/n))/(sqrt((sumXsq-(sumX**2/n)) * (sumYsq-(sumY**2/n))))
where
n = fromIntegral (length xs)
sumX = sum xs
sumY = sum ys
sumXsq = sum([ valX*valX | valX <- xs ])
sumYsq = sum([ valY*valY | valY <- ys ])
psum = sum([ fst val * snd val | val <- zip xs ys ])

最佳答案

在这种情况下,错误消息有些误导。真正的问题是 pearson 不返回 IO something。如果你想打印结果,写

main = do
...
print $ pearson input1 input2

这里GHC混淆的原因是pearson的推断类型是

pearson :: Floating a => [a] -> [a] -> a

所以当您尝试将它用作 do block 中的语句时,它会从返回类型推断出 a ~ IO b 因此参数必须具有类型 [IO b ]。但是,它已经知道它们的类型为 [Float],因此您会收到一条令人困惑的错误消息,提示它无法将 FloatIO b 匹配当问题的根源是返回类型时在参数中。

我支持 Dave 关于向您的函数添加类型签名的建议。它可以使错误消息更有帮助。例如,如果您给 pearson 类型签名 pearson::[Float] -> [Float] -> Float,您会收到此消息:

Pearson.hs:8:5:
Couldn't match expected type `IO b0' with actual type `Float'
In the return type of a call of `pearson'
In a stmt of a 'do' block: pearson input1 input2

关于algorithm - Pearson 相关系数与 Haskell 浮点型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12863003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com