2012-02-15 3 views
0

여기서 무슨 일이 일어나는 지 이해할 수 없습니까? 아무도이 코드를 설명해 주시겠습니까? 이 함수는 길이를 어떻게 계산합니까?길이를 계산할 수있는 하스켈 고차 함수

callength = foldr (\_ n -> 1 + n) 0 

왜 사용합니까 람다는 오른쪽에, 밑줄 n 및 제로 사이의 공간을 강조?

+7

I을 하스켈에 관한 어떤 책의 제 3 장처럼 그 질문에 대한 답을 찾을 수있을 것이라고 생각합니다. 이것은 아주 기본적인 것입니다. –

+5

람다가 마음에 들지 않는다면'foldr (((+1).). (flip const)) 0' 대신에 ... – Landei

+1

'foldr'은 무엇이고 어떻게 동작하는지 알고 있습니까? 글쎄, 어쨌든 그것에 대한 철저한 설명을했다. [Learn You a Haskell] (http://learnyouahaskell.com/)은 lambda, 밑줄, 접기, 함수 등을 설명하는 "Haskell 시작하기"책으로 적극 추천됩니다. –

답변

18

(\_ n -> 1 + n)은 두 개의 인수를 취하고 두 번째 인수보다 하나 더 많은 값을 반환하는 함수를 의미합니다. 밑줄은 매개 변수가 무시된다는 것을 의미합니다.

[1, 2, 3, 4] 

이 실제로 그냥 :

이제
foo x n = 1 + n 

는, 예를 들어 여기 목록입니다 : 같은 비교를 위해, 와일드 카드 패턴 (밑줄)를 사용하지 않고 최상위 선언으로,이 기능은 보일 것이다 무엇 foldr는 재귀가 주어진 것 기능과 각 (:)가 대체됩니까

1 : 2 : 3 : 4 : [] 

하고: 구문 설탕 함수 뒤에 인수가있는(, 제로). 그래서, 어떤 fz에 대한 foldr f z [1, 2, 3, 4]은 다음과 같습니다

f 1 (f 2 (f 3 (f 4 z))) 

(foldr (:) [] 그냥 동일한 목록 당신이 그것을주고 다시 반환하는 이유는 - 그것은 원래 목록 구조를 재구성 끝을.)이에서

우리는 foo는 첫 번째 인자를 무시 알고

foo 1 (foo 2 (foo 3 (foo 4 0))) 

, 한 MOR를 반환하는 경우는, 기능 foo과 제로 0을 사용하여, 그것과 같다 e 두 번째 인수보다. 이는 다음과 같습니다.

1 + (1 + (1 + (1 + 0))) 

4, 목록의 길이입니다. 기본적으로 접기는 목록의 모든 요소를 ​​무시하고 모든 요소에 대해 누적기를 추가하여 길이를 제공합니다. 0은 전체 프로세스를 종료하는 데 사용되며, 빈리스트의 길이가 0

더 자세히이를 보려면 있기 때문에, 우리는 각각의 호출 단계별로 확장 할 수 있습니다 :

foldr foo 0 (1 : 2 : 3 : 4 : []) 
foo 1 (foldr foo 0 (2 : 3 : 4 : [])) 
1 + foldr foo 0 (2 : 3 : 4 : []) 
1 + foo 2 (foldr foo 0 (3 : 4 : [])) 
1 + 1 + foldr foo 0 (3 : 4 : []) 
1 + 1 + foo 3 (foldr foo 0 (4 : [])) 
1 + 1 + 1 + foldr foo 0 (4 : []) 
1 + 1 + 1 + foo 4 (foldr foo 0 []) 
1 + 1 + 1 + 1 + foldr foo 0 [] 
1 + 1 + 1 + 1 + 0 
1 + 1 + 1 + 1 
1 + 1 + 2 
1 + 3 
4 
+0

와우. 그것은 하스켈의 핵심 기본 사항에 대한 인내심이 깊은 설명이었습니다. +1. –