전체 글 94

[4장 고차함수] 커링함수 - 확장함수 만들기

지난번에는 일반 함수와 커링함수를 직접 만들어서 구현하였다. 코틀린은 기본함수로 커링을 제공하지 않기때문에, 이를 지원하기 위해 커링함수를 확장함수로 구현해본다. 다음 코드는 매개변수 3개인 함수를 커링함수로 바꾸어주는 함수 코드이다. fun ((P1,P2,P3)->R).curried() : (P1) -> (P2) -> (P3) -> R = { p1:P1 -> {p2:P2 -> {p3:P3 -> this(p1,p2,p3) } } } fun ((P1) -> (P2) -> (P3) -> R).uncurried() : (P1,P2,P3)->R= { p1:P1, p2:P2, p3:P3 -> this(p1)(p2)(p3) } curried 함수를 통해 커링함수 아닌 것을 커링함수로 구현하고, uncurried 함..

[4장 고차함수] 커링함수

커링(currying) : 여러개의 매개변수 받는 함수를 분리 -> 단일매개변수로 받는 체인 함수 아래의 예시를 보자. fun addTwo(a : Int, b : Int) : Int = a+b fun addTwoCurried(a : Int) : {b : Int -> { a+b } } addTwo와 같이 a,b 두개의 매개변수로 받는 함수를 addTwoCurried와 같이 매개 변수 하나씩 받으며 하나의 체인으로 연결되는 함수를 의미한다. addTwo(1,2) 와 addTwoCurried(1)(2) 와 동일한 3을 출력한다. 커링으로 변환해주는 함수는 아래와 같을 것이다. fun addTwo(a : Int, b : Int) : Int = a+b fun addTwoCurried(a : Int) : {b : ..

[프로그래머스][C++] 기능개발

문제 설명 프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요. 제한 사항 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다. 작업 진도는 100 미만의 자연수입니다. 작업 속도는 100 이하의 자..

[Redux] react-redux 사용시 Invalid hook call at Provider

redux를 사용하기 위해서 적용하던중, import React from "react"; import ReactDOM from "react-dom"; import { createStore } from 'redux'; import { Provider } from 'react-redux'; import { composeWithDevTools } from 'redux-devtools-extension'; import RootReducer from './redux/RootReducer'; import App from "./App"; import reportWebVitals from "./reportWebVitals"; import "./css/index.css"; const store = createStore(..

[4장 고차함수] 4.3 부분 적용 함수

부분 함수와 이름이 비슷하지만 관계없다. 부분 적용 함수 : 말그대로 부분적으로 적용한 함수이다. 매개변수의 일부만 전달받았을 때, 제공받은 매개변수만 가지고 연산하는 함수이다. fun main(args: Array){ val func = {a : String, b : String -> a+b} val partiallyAppliedFunc = func.partial("Hi"); // 매개변수 a,b중 a만 적용 : 부분적용됨 val ret = partiallyAppliedFunc(" Hello");// a,b 둘다 적용된 상태 println("result : $ret ") } fun ((P1,P2)-> R).partial(p1: P1) : P2 ->R { return { p2 -> this(p1,p2) ..

[4장 고차함수] 4.2 부분함수

부분함수 : 모든 가능한 입력 중, 일부 입력에 대한 결과만 정의한 함수. fun triple(x: Int) = x*3 fun partialTriple(x:Int) : Int = { if(x>100) x*3 else { throw IllegalArgumentException() } } 위의 예시와 같이 100이하의 숫자에 대해서(일부 입력에 대해서) 결과만 정의되어있고, 나머지는 exception을 출력한다. 이러한 함수를 부분함수하고 한다. 연습문제 4-1을 보며 익숙해져보자. 연습문제 4-1 : PartialFunction 클래스에 invokeOrElse 함수와 orElse 함수를 추가해보자. invokeOrElse함수는 입력값 p가 조건에 맞지 않을 때 기본값 default를 반환한다. orElse..

[4장 고차함수] 고차함수란

코틀린에서 함수는 일급함수(first-class function)이다. 일급함수는 함수를 인자로 받거나 반환값으로 반환하는 것이 가능하다. 함수형 프로그래밍에서 말하는 고차함수는, 1. 함수를 매개변수로 받는 함수 2. 함수를 반환하는 함수 다음 두가지 조건 중 하나이상을 만족하면 고차함수(higher order function)라고한다. 예시 // 함수를 인자로 받는 함수 fun highFunc( func: () -> R ) : R { return func() } // 함수를 반환값으로 받는 함수 fun highFunc1() : () -> Unit { return { println("This is Higher Order Function") } } 고차 함수의 장점 1. 간결하게 코드를 짜 재사용성을 높..

[React] useEffect에서 클린업 함수

요약 : useEffect에서 클린업 함수를 사용하고자한다면 useRef 함수를 이용해 최신 값을 가지고 있자! useEffect 함수에서 클린업 함수(return시 사용하는 함수) 호출시, 초기값을 가지고 있는 문제가 있었다. 프로젝트를 진행하던 중, setState로 저장하고 있는 변수(A라고 하자)가 웹페이지에서 변경되고 있다가, 컴포넌트가 사라질 때(다른 페이지/컴포넌트로 랜더링될 때) 클린업 함수로 업데이트된 A변수를 DB에 저장하려고 했었다. 그런데 문제는 A변수가 처음값(처음 랜더링되었을 때 값)으로 출력이 된다는 것이다. (아래 예시) const PageContentsList = () => { const [A, setA] = useState([]); const Update = async (..

[프로그래머스][Python] 베스트 앨범

문제 설명 스트리밍 사이트에서 장르 별로 가장 많이 재생된 노래를 두 개씩 모아 베스트 앨범을 출시하려 합니다. 노래는 고유 번호로 구분하며, 노래를 수록하는 기준은 다음과 같습니다. 속한 노래가 많이 재생된 장르를 먼저 수록합니다. 장르 내에서 많이 재생된 노래를 먼저 수록합니다. 장르 내에서 재생 횟수가 같은 노래 중에서는 고유 번호가 낮은 노래를 먼저 수록합니다. 노래의 장르를 나타내는 문자열 배열 genres와 노래별 재생 횟수를 나타내는 정수 배열 plays가 주어질 때, 베스트 앨범에 들어갈 노래의 고유 번호를 순서대로 return 하도록 solution 함수를 완성하세요. 제한사항 genres[i]는 고유번호가 i인 노래의 장르입니다. plays[i]는 고유번호가 i인 노래가 재생된 횟수입니..

[3장 재귀] 3.7 실전 응용 - 멱집합 구하는 함수

꼬리 재귀 멱집합 구하는 버젼을 공부했다. 1. powerset 함수 기본 fun Set.head() = first() fun Set.tail() = drop(1).toSet() fun powerset(s : Set ) : Set = when { s.isEmpty() -> setOf(setOf()) else -> { val head = s.head() val restSet = powerset(s.tail()) restSet + restSet.map{ setOf(head) + it}.toSet() } } 2. powerset 꼬리 재귀 버전 tailrec fun powersetTailrec(s : Set, acc : Set) : Set = when { s.isEmpty() -> acc else -> { p..

반응형