2017-11-03 1 views
0

나는 프로그램에서 일하고있다. 의지는 트리플의 목록을 취하고 그 중 하나에 따라 다른 부분의 합을 찾고 싶다. 트리플.목록의 일부를 누적시키는 프로그램 만들기 - Haskell

totalWeightOfFirstClass :: [Parcel] -> Weight 
totalWeightOfFirstClass [] = go 
totalWeightOfFirstClass ((weight, postcode, firstclass):xs) = 
    if firstclass == True then 
    go weight 
    totalWeightOfFirstClass xs 
    else 
    totalWeightOfFirstClass xs 
where 
    go :: Int -> Int 
    go _ = 0 
    go x = 

따라서 프로그램은 목록에있는 모든 가중치를 더하고 그 트리플이 첫 번째 클래스 인 경우에만 끝에 표시해야합니다. 지금까지 필자는 모든 값을 누적하고 결과적으로 결국 표시하고자하는 도우미 선언문을 가지고 있습니다.

도움이나 조언을 주시면 감사하겠습니다.

안부, Kieran. 코드에서 너무 많은 일을의

totalWeightOfFirstClass :: [Parcel] -> Weight 
totalWeightOfFirstClass [] = 0 
totalWeightOfFirstClass ((weight, postcode, firstclass):xs) 
    | firstclass = weight + totalWeightOfFirstClass xs 
    | otherwise = totalWeightOfFirstClass xs 

답변

1

, 당신은 소포가 첫 수업을 전송되는 가중치의 합이,이 트릭을 할해야합니다. 이와 같이 기본적인 재귀를 작성하는 대신 코드를 표현하기 위해 일반 결합자를 사용하는 것이 좋습니다.

totalWeightOfFirstClass = sum . (fmap (\(weight, _, _) -> weight)) . filter (\(_, _, firstc) -> firstc) 

필터를 적용한 후에 모든 가중치의 합계입니다. 보시다시피, 코드는 읽기에 매우 깨끗합니다.

+0

오히려 비효율적입니다. 왜 볼 수 있니? – dfeuer

+0

@ dfeuer 만약 당신이 처음에 필터링 된 여분의 메모리를 제거하고 태드 더 빨리 될 것이라고 필터링하지만, 꼬리 재귀 및 합계 함수의 표준 재귀 구현을 것, 나는 뭔가 놓친 오전 것 같은데? 개인적으로 HuStmpHrrr의 솔루션과 비슷한 방법으로 구현 하겠지만 좀 더 이해하기 쉽도록하고 싶습니다. – Zpalmtree

+0

@dfeuer 이유를 알 수 없습니다. 아마 너 자신을 말할 수 있을까? –

2

: 내가 제대로 이해 해요 경우

+1

긴 체인을'let' 또는'where'를 사용하여 쉽게 읽을 수 있습니다. 최소한 줄 바꿈과 설명을 추가하십시오! – dfeuer

+0

몇 가지 도우미 함수만으로 큰 가독성을 확보 할 수 있습니다. 'weight (w, _, _) = w;를 정의한 후에; firstclass (_, _, fc) = fc'이면 이것은 합계가됩니다. 지도의 무게. 필터 firstclass'. –

+0

@DanielWagner 확실히. 그것이 '데이터'유형이고 레코드 구문으로 정의되는 경우, 해당 함수는 무료입니다. – HuStmpHrrr

관련 문제