2017-12-29 33 views
0

내가 데이터 하스켈은

data Expense = MkExpense Double String deriving (Eq,Ord) 

및 비용의 목록 어떠했는지를 계산

balanced :: [Expense] -> Double -> Bool 
balanced expenses epsilon = 
    let amounts = ... 
    in maximum amounts - minimum amounts < epsilon; 

잔액되는 함수가 있다고 가정 목록의 변수의 목록을 (즉, 모든 사람이 동일하게 지급 부동 소수점 에러로 인한 엡실론의 최대 차이로), 엡실론은 0.01의 값을 갖는다.

그 이유는 정확하지만, 3 개의 점이있는 경우 복식 목록을 추출하려고합니다. 내 매개 변수의 모든 비용을 두 배로 늘릴 수 있습니다. 데이터 유형을 변경하지 않고 어떻게 할 수 있습니까?

+6

이 ISN

balanced :: [Expense] -> Double -> Bool balanced expenses epsilon = let amounts = map extractExpense expenses in maximum amounts - minimum amounts < epsilon 

그리고 extractExpense는 데이터의 Double 값의 언 래퍼 것 't 직접 귀하의 질문에 관련되어 있지만 강력하게 부동 소수점 값을 사용하지 않는 것이 좋습니다 t o 돈을 나타냅니다. 정수 대신 정수를 사용하는 경우 (예 : 미국 통화를 처리하는 경우) - 예에서 엡실론과 같은 것에 대해 더 이상 걱정할 필요가 없습니다. 통화를 더하고, 빼고, 곱할 수 있습니다 값을 반올림하거나 그런 것에 대해 걱정할 필요가 없습니다. – bdesham

답변

2
다음과 같이 진행할 수

:

extractExpense :: Expense -> Double 
extractExpense (MkExpense expense _) = expense 

또는보다 간결 :

balanced :: [Expense] -> Double -> Bool 
balanced expenses epsilon = 
    let amounts = map extractExpense expenses 
    in maximum amounts - minimum amounts < epsilon 
    where extractExpense (MkExpense e _) = e 
+0

레코드 구문을 사용하면'extractExpense' 함수가 생성됩니다. – 4castle