TIP게시판

제목 php로 currying 구현 하기
글쓴이 한대승(불의회상) 작성시각 2014/08/18 19:31:19
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 10004   RSS
한대승(불의회상)
php는 함수를 인자로 넘겨주고 결과 값을 함수로 받을 수 가 있습니다.

이거시 무슨 말인가 했더니 아래 처럼 함수를 만들 수 있다는 이야기 입니다.
function curry($fun) {
	return function($arg) use ($fun) {
		return $fun($arg);
	};
}
사용 할때는
$to_int = curry('intval');

echo $to_int('123'); // 결과 : 123
이렇게 함수를 인수로 전달해주고 함수를 결과로 받아 사용이 가능하다는거죠.

그럼 아래의 경우는 어떻게 해야 할까요?
function curry2($fun) {
	return function($s_arg) use ($fun) {
		return function($f_arg) use ($fun, $s_arg) {
			return $fun($f_arg, $s_arg);
		};
	};
}

// currying 할 함수
function div($n, $d) {
	return $n / $d;
}

한개도 복잡한데 리턴하는 함수가 두개네요... ㅡㅡ;;
하나씩 풀어가면 간단한데...
$divf = curry2('div');
$div10 = $divf(10);
echo $div10(50); // 결과 : 5
함수 2개 리턴한다고 변수를 2개 써야 하네요....
혹시나 하고 요렇게 해봤는데....
$div10 = (curry2('div'))(10); // Parse error: syntax error, unexpected '(' in ......
역시나 에러만....
구글신에 접신해 보니 __invoke() 라는게 걸리네요.
혹시나 하고 덮붙여 봤습니다.
echo curry('intval')->__invoke('11'); // 결과 : 11

$div10 = curry2('div')->__invoke(10);
echo $div10(50); // 결과 : 5

echo curry2('div')->__invoke(10)->__invoke(50); // 결과 : 5

어잌후~~ 이게 웬 떡입니까?
구글신 덕분에 재밌는거 알게 되었습니다.

PHP도 함수를 클래스로 처리 하나???
 다음글 디비로 동적 라우팅 구성하기. (5)
 이전글 함수 전달 인자를 유연하게 처리 할 수 함수 예제 (3)

댓글

변종원(웅파) / 2014/08/20 15:51:43 / 추천 0
어디 다 써야할까요? ^^
kaido / 2014/08/20 18:38:24 / 추천 0
비슷 하다면 비슷한 유형인데..

저는 가변변수 중첩 선언도 이해가 안 가던데요.
 
$$$$data = "data1";
이거 대체 어디다가 쓰는건가요... 무얼 지칭 하는지도 알기 어렵고 잘못보면 오타로 보이기도 합니다.
한대승(불의회상) / 2014/08/21 14:26:43 / 추천 0
물론 함수형 프로그래밍에 사용합니다.
함수형 프로그래밍을 학습 중인데 마구마구 영감이 떠오르네요.
조만간 간단히 정리해서 샘플 올리도록 하겠습니다.