여기서 무슨 일이 일어나는 지 이해할 수 없습니까? 아무도이 코드를 설명해 주시겠습니까? 이 함수는 길이를 어떻게 계산합니까?길이를 계산할 수있는 하스켈 고차 함수
callength = foldr (\_ n -> 1 + n) 0
왜 사용합니까 람다는 오른쪽에, 밑줄 n 및 제로 사이의 공간을 강조?
여기서 무슨 일이 일어나는 지 이해할 수 없습니까? 아무도이 코드를 설명해 주시겠습니까? 이 함수는 길이를 어떻게 계산합니까?길이를 계산할 수있는 하스켈 고차 함수
callength = foldr (\_ n -> 1 + n) 0
왜 사용합니까 람다는 오른쪽에, 밑줄 n 및 제로 사이의 공간을 강조?
(\_ n -> 1 + n)
은 두 개의 인수를 취하고 두 번째 인수보다 하나 더 많은 값을 반환하는 함수를 의미합니다. 밑줄은 매개 변수가 무시된다는 것을 의미합니다.
[1, 2, 3, 4]
이 실제로 그냥 :
이제foo x n = 1 + n
는, 예를 들어 여기 목록입니다 : 같은 비교를 위해, 와일드 카드 패턴 (밑줄)를 사용하지 않고 최상위 선언으로,이 기능은 보일 것이다 무엇 foldr
는 재귀가 주어진 것 기능과 각 (:)
가 대체됩니까
1 : 2 : 3 : 4 : []
하고: 구문 설탕 함수 뒤에 인수가있는(, 제로). 그래서, 어떤 f
및 z
에 대한 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
와우. 그것은 하스켈의 핵심 기본 사항에 대한 인내심이 깊은 설명이었습니다. +1. –
I을 하스켈에 관한 어떤 책의 제 3 장처럼 그 질문에 대한 답을 찾을 수있을 것이라고 생각합니다. 이것은 아주 기본적인 것입니다. –
람다가 마음에 들지 않는다면'foldr (((+1).). (flip const)) 0' 대신에 ... – Landei
'foldr'은 무엇이고 어떻게 동작하는지 알고 있습니까? 글쎄, 어쨌든 그것에 대한 철저한 설명을했다. [Learn You a Haskell] (http://learnyouahaskell.com/)은 lambda, 밑줄, 접기, 함수 등을 설명하는 "Haskell 시작하기"책으로 적극 추천됩니다. –