2009-08-27 5 views
6

위키 백과 페이지에서 summation에 관해서는 하스켈에서의 동등한 조작은 접기을 사용하는 것입니다. 내 질문은 :이 대신 합계를 사용하는 이유가 무엇입니까? 다른 하나보다 '순수 주의자'인가, 아니면 진정한 차이가없는 것인가?하스켈에서의 summation 표기법

답변

11

foldl은 일반적으로 tail-recursive reduce 기능입니다. 재귀는 함수형 프로그래밍 언어에서 항목 목록을 조작하는 일반적인 방법이며 루프 반복에 대한 대안을 제공합니다.이 반복은 훨씬 더 우아합니다. fold과 같은 감소 함수의 경우 꼬리 재귀 구현 is very efficient. 다른 사람들이 설명한 것처럼 sumfoldl (+) 0 l의 편리한 니모닉입니다.

아마도 위키 백과 페이지에서의 사용은 꼬리 - 재귀를 통한 합계의 일반적인 원칙을 설명하기위한 것입니다. 그러나 Haskell Prelude 라이브러리에는 더 짧고 이해하기 쉬운 sum이 포함되어 있으므로이를 코드에서 사용해야합니다.

여기에는 하스켈의 fold 기능 중 nice discussion 기능이 있으며, 읽기 쉬운 가치있는 간단한 예제가 있습니다.

3

하스켈 또는 위키 백과 페이지의 foldl에 대한 내용은 표시되지 않지만, 하스켈의 sumfoldl이라는 특수한 경우입니다. 그것은 예를 들어, 다음과 같이 구현할 수 있습니다 차이가 없습니다

sum = foldl (+) 0 
+0

아아, 이제 알겠습니다. 나는 'foldl'에 대한 검색을했지만 Wikipedia 페이지는 'fold'를 사용합니다. –

0

:

sum l = foldl (+) 0 l 

로 감소 될 수있다. 이 페이지는 단순히 sumfoldl을 사용하여 구현되었다고 말하고 있습니다. 숫자 목록의 합계를 계산할 필요가있을 때마다 sum을 사용하면됩니다.

1

다른 사람들이 말했듯이 아무런 차이가 없습니다. 그러나 총 통화는 폴드 콜보다 읽기가 쉽기 때문에 합계가 필요한 경우 합계로 이동하십시오.

2

주목할 점은 합계가 원하는 것보다 더 게으르다는 것입니다. 따라서 foldl '을 사용해보십시오.

0

합계의 개념은 숫자가 아닌 유형으로 확장 할 수 있습니다. 필요한 것은 모두 (+) 연산 및 0 값과 동일한 것입니다. 즉, monoid이 필요합니다. 이것은 하스켈 함수 "mconcat"로 이어지며, 이는 monoid 타입의 값 목록의 합을 반환합니다. 물론 디폴트 인 "mconcat"은 플러스 연산 인 "mappend"에 의해 정의됩니다.