2011-11-12 3 views
-3

파일에서 튜플 목록을 가져 와서 각 튜플의 세 번째 값을 여러 개 두 번째로 가져와야합니다. 예 : [(1, "A", 100,2), (2, "B", 50,3)]. 나는 100 * 2 = 200과 50 * 3 = 150을 찾아야한다. 나는 최종 합계 만 표시하고 싶다. 350입니다. 파일에서 튜플 목록을 가져옵니다. 오류가 발생했습니다.튜플과 파일 목록에 관해

- Type error in generator 
*** Term   : generator c 
*** Type   : Int 
*** Does not match : IO a 

코드는 다음과 같습니다.

type Code=Int 
type Price=Int 
type Quantity=Int 
type Name=String 
type ProductDatabase=(Code,Name,Price,Quantity) 
bill=do 
      b<-cart_list_returner  
      let c :: [ProductDatabase] 
       c = b  
      w<-generator c 
      let r :: String 
       r = w 
      putStrLn r 

    generator::[ProductDatabase]->Int 
    generator c=foldl (\a (id,x, y, z) -> a + y*z) 0 c 

그냥 파일에서 튜플 목록을 가져 와서 총 합계를 생성하고 싶습니다. 어떤 사람은 나를 도와줍니다. 미리 감사드립니다.

+0

100을 선

 w<-generator c 

교체 2), (2, "B", 50,3)] 목록? –

+0

@ dmitry.malikov : 선생님, 사실 저는 하스켈의 전문가는 아닙니다. 그냥 작은 과제를 해. 그래서 다른 이슈가오고 있습니다. 어쨌든 같은 문제에 대해 너무 많은 질문을하는 것에 대해 유감입니다. – Roy

+0

@Roy : 이러한 질문이 과제와 관련이 있다면 과제를 숙제로 표시해야합니다. 또한 모든 질문을 거치고 정답을 수락하면 좋을 것입니다. 감사합니다! –

답변

0

IO 기능을 실행하려는 경우에만 <- 바인딩 연산자를 사용하십시오.

순수 함수 결과에 이름을 부여하려면 let을 사용하십시오.

generator은 순수한 함수입니다. 그 결과는 형식이 Int이고 IO Int이 아닙니다.

그래서, 어쩌면 그것에 대해 유사한 질문 [(1, "A"를 많이 요구하는 것보다 하나 개의 일반적인 질문을 공식화하는 더 나은했다

 let w = generator c 
+0

아직도 오류가 있습니다. – Roy

+0

@Roy'cart_list_returner'의 결과가'print b' 줄을 추가하여 예상대로인지 확인하십시오. – dave4420

+0

그건 내 실수 였어. 귀하의 대답은 정확합니다. 고마워요. – Roy