2011-06-12 4 views
0
--Standered Diviation 
module SD where 
diviation:: IO() 
diviation = 
    do 
     putStrLn ("Enter Students Marks") 
     marks <- getLine 
     let m = (read marks)::[Float] 
     let x = sum' m 
     let mean = (fromIntegral x)/(fromIntegral $ length) 
     let len = (read (length(m)))::Float 
     let divia = divi mean l 
     let std = map (^2) divia 
     let stdd = xx length(m-1) m 
     let final = map sqrt stdd 
     let tot = sum final 

     if(m==[]) 
       then 
       putStrLn("empty List" ++ show(tot)) 
      else do 
       putStrLn("The Standered Divation is" ++ (show(tot))) 


sum' :: (Num a) => [a] -> a 
sum' = foldl (+) 0 

avg::Float->Float->Float 
avg a b = (fromIntegral a)/(fromIntegral b) 

divi::Float->[Float]->[Float] 
divi a xs = [x-a | x <- xs] 

xx::Float->[Float]->[Float] 
xx a xs = [x/a|x<-xs] 

이 프로그램의 문제점을 알아낼 수 없습니다. 너희들이이 프로그램에 문제가 저를 지적하시기 바랍니다 수있는이haskell programm (유형 오류)의 문제점

ERROR file:.\SD.hs:11 - Type error in application 
*** Expression  : read (length m) 
*** Term   : length m 
*** Type   : Int 

과 같은 오류가 당신에게 감사 보여줍니다 * 일치하지 않습니다 : [샤아]

+4

'Int'에'read'를 호출 할 수 없습니다. 이는'length'가 반환하는 것입니다. 'read'는 문자열을위한 것입니다. –

+0

또한 'len'값을 실제로 사용하지 않습니다. 그래서 그냥 'let len ​​= (read (length (m)) :: Float' –

답변

0

함수 읽기 문자열을 입력있다 -> 'a; 당신의 에러는 길이 m이 Int 타입을 가지고 있고, 읽는 것이 String을 기다리고 있다는 것을 알려준다. Data.List의 genericLength를 사용할 수 있습니다.

let len = Data.List.genericLength m :: Float 
1

코드에서 수행 할 작업이 몇 가지 있습니다. 당신은 가지고있다 :

let stdd = xx length(m-1) m 

어떤 타입 체크도하지 않을 것이다. 나는 당신이 의미 생각 :

let stdd = xx (length m-1) m 

(편집 : 사실, 그 XX의 형태 서명에 의한 중 하나를 확인하지 않습니다 (왜).?)이 줄 :

let mean = (fromIntegral x)/(fromIntegral $ length) 

Num입니다 기능을으로 나눈 값입니다. `

let std = map (^2) divia 

divia의 유형은 무엇이며, (^2)의 유형은 무엇입니까 :이 라인에서

?

마지막으로 실제로 빈 목록 또는 싱글 톤 목록의 경우 어떻게됩니까?

제쳐두고 프로그램의 어느 부분이 실제로 main 안에 있어야하는지 생각해보십시오. 약자로, 당신은

는 이유를 고려하지 그 계산의 결과를 인쇄 표준 편차

  • 컴퓨팅 라인
  • 읽기 입력
  • 인쇄있어 standardDev 기능? 그러면 main 기능이 더 짧고 명확해질 수 있습니다. 순수 함수를 작성하면 REPL에서 함수를보다 편리하게 테스트 할 수 있습니다. 필자가 코드를 작성할 때 짧고 분명하게 올바른 함수를 작성하고, 원하는 동작을 얻고, 최종 순간에만 IO 모나드에 결과를 덤프하는 것이 매우 유용하다는 것을 알게되었습니다.