Algorithm Pearson相关性与Haskell浮点型冲突
我正试图编写一个程序,加载两个文本文件,将这些文件中的数字转换成两个列表,然后计算这些列表之间的pearson相关性 pearson函数只能接受浮点,所以我创建了一个名为floatconvert的函数来尝试解决这个问题,但它没有。我得到一个错误,在“pearson”的第一个参数中,即“input1”,无法将预期类型“IO b0”与实际类型“Float”匹配 如果您能帮助解决此问题,我们将不胜感激Algorithm Pearson相关性与Haskell浮点型冲突,algorithm,haskell,type-conversion,Algorithm,Haskell,Type Conversion,我正试图编写一个程序,加载两个文本文件,将这些文件中的数字转换成两个列表,然后计算这些列表之间的pearson相关性 pearson函数只能接受浮点,所以我创建了一个名为floatconvert的函数来尝试解决这个问题,但它没有。我得到一个错误,在“pearson”的第一个参数中,即“input1”,无法将预期类型“IO b0”与实际类型“Float”匹配 如果您能帮助解决此问题,我们将不胜感激 main = do input1file <- readFile "input1.tx
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 ])
main=do
input1file在这种情况下,错误消息有些误导。真正的问题是,pearson
没有返回IO something
。如果你想打印结果,写
main = do
...
print $ pearson input1 input2
GHC在这里感到困惑的原因是推断出的皮尔逊类型是
pearson :: Floating a => [a] -> [a] -> a
因此,当您尝试将其用作do块中的语句时,它从返回类型推断出a~IO b
,因此参数必须具有类型[IO b]
。但是,它已经知道它们的类型是[Float]
,因此当问题的根源是返回类型时,您会收到一条令人困惑的错误消息,说明它无法在参数中将Float
与IO 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
在函数中添加类型签名,错误消息将更接近错误所在。非常感谢您的帮助和回复。