Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- WebView
- template
- RAII
- Clojure
- Chrono
- async
- program
- go
- Scala
- sprintf
- AES
- stringprintf
- design pattern
- ChromeTab
- Functional
- Android
- c++
- CustomTab
- SHA512
- kotlin
- ranges
- type_traits
- traits
- SHA1
- Reflect
- haskell
- coroutines
- Observer
- sha256
- web
Archives
- Today
- Total
프로그래밍 검색 블로그
clojure 함수형 프로그래밍 2 (reduce, reduce-kv) 본문
1 2 | (reduce + [1 2 3 4]) => 10 | cs |
reduce [함수] [원소]
1 2 | (reduce + 99 [1 2 3 4]) => 109 | cs |
reduce [함수] [초기값] [원소]
동작하는 방식은 초기값이 있을 때는
첫번째 인자가 초기값,
두번째 인자가 리스트의 원소,
함수호출 1번
두번째 부터는 처음 계산한 값이 첫번째 인자
두번째는 리스트의 원소 식으로 계산된다
리스트형의 경우에는 별로 중요하지 않을수도 있는데
문제는 맵 (#으로 시작하는 함수는 람다식, val은 MapEntry에서 value를 가져온다)
1 2 | (reduce #(+ (val %1) (val %2)) {:a 1 :b 2 :c 3}) ClassCastException java.lang.Long cannot be cast to java.util.Map$Entry clojure.core/val (core.clj:1525) | cs |
첫번째 호출은 문제없이 돌아가지만 두번째는 정수형으로 변환하여 사용할수가 없는데
이럴때는 초기값을 사용하면 해결할수 있다
1 2 | (reduce #(+ %1 (val %2)) 0 {:a 1 :b 2 :c 3}) => 6 | cs |
reduce-kv라는 함수도 있는데 이 함수를 사용하면 val을 호출하는것보다 약간 더 보기에 편할수도 있다
1 2 | (reduce-kv #(+ %1 %3) 0 {:a 1 :b 2 :c 3}) => 6 | cs |
람다식을 안쓰면
1 | (reduce-kv (fn [sum key val] (+ sum val)) 0 {:a 1 :b 2 :c 3}) | cs |
'clojure기초' 카테고리의 다른 글
clojure 함수형 프로그래밍 3 (apply) (0) | 2017.10.26 |
---|---|
clojure 함수형 프로그래밍 3 (range) (0) | 2017.10.22 |
clojure 함수형 프로그래밍 1 (map) (0) | 2017.10.22 |
clojure 함수형 패턴매칭 3 (condp) (0) | 2017.10.21 |
clojure 함수형 패턴매칭 2 (case) (0) | 2017.10.21 |
Comments