Algorithm Pearson相关性与Haskell浮点型冲突

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

我正试图编写一个程序,加载两个文本文件,将这些文件中的数字转换成两个列表,然后计算这些列表之间的pearson相关性

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

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

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

在函数中添加类型签名,错误消息将更接近错误所在。非常感谢您的帮助和回复。