2012-10-12 4 views
3

2 개의 텍스트 파일을로드하고, 그 파일의 숫자를 2 개의리스트로 변환 한 다음, 그리스트 사이의 피어슨의 상관 관계를 계산하는 프로그램을 작성하려고합니다.하스켈 플로트 타입 충돌과의 피어슨 상관

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 ]) 
+1

이 함수 타입의 서명을 추가하고 오류 메시지가 가까이 실수가 어디까지 얻을 것이다 : 당신이 pearson에게 유형 서명 pearson :: [Float] -> [Float] -> Float를 부여했다 예를 들어, 당신은이 메시지를받은 것입니다. – dave4420

답변

10

이 경우 오류 메시지가 다소 오도합니다. 실제 문제는 pearsonIO something을 반환하지 않는다는 것입니다. 당신이 결과를 인쇄하는 것을 의미하는 경우,

main = do 
    ...  
    print $ pearson input1 input2 

여기에서의 GHC의 혼란에 대한 이유 당신이 할 일에 문으로 사용하려고 할 때 피어슨의 추론 유형

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

그래서 있다는 것이다 쓰기 -block 인 경우 반환 유형이 a ~ IO b 인 것으로 간주되므로 인수의 형식은 [IO b]이어야합니다. 그러나 이미 형식이 [Float] 인 것을 알고 있으므로 문제의 원인이 반환 형식 인 경우 인수에 FloatIO b과 일치시킬 수 없다는 혼동스러운 오류 메시지가 나타납니다.

두 번째는 함수에 형식 시그니처 추가에 대한 조언입니다. 오류 메시지를보다 유용하게 만들 수 있습니다.

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 
+0

도움과 협조에 진심으로 감사드립니다. –