f = \x -> x + 1
g = \x -> 2 * x
에대해
f . g를 계산했다고 해봅시다.
먼저, f와 g 데이터 각각은 코드영역의 데이터일 것입니다.
f 1, f 2, f3을 하더라도 모두 다 같은 코드쪼가리에 도달해서 절차를 밟을것입니다.(하스켈의 구현에 대한 이야기)
그러면 f . g는요?
f . g에 대한 데이터는 코드영역에 박혀있지 않습니다.
하스켈이 모든 고차함수 반환값들을 힙에 저장할까요?
사실 합성의 경우는 생각하기가 용이합니다.
. 이라는 연산이 인자로 전달받은 코드를 순차실행하고,
.이라는 연산자에 두개의 코드쪼가리에 대한 참조가 전달된다면 효과적으로 데이터를 표현할 수 있습니다.
커리잉을 생각해 보죠
a -> b -> b 에 a를 대입해서 반환된 b -> b 함수는 기존의 a -> b -> b 코드를 얼마만큼 재사용할까요?
적어도 기존의 a -> b -> b 코드에다가 a 데이터를 얹은 만큼의 데이터가 필요할 것입니다.
a -> b -> b 코드는 재활용한다고하면, 코드에 대한 참조와 a 데이터 만큼의 데이터가 필요하겠네요.
합성과 커리잉에 대해 "이렇게 코드쪼가리들을 참조하면 되겠다" 를 알아보았는데요,
이 모든 질문은 이런말로 다시생각해볼수 있습니다.
"연산을 할때마다 새로운 함수들이 새로 생성된다. 자바코드로 따지자면 소스코드가 복제되는 형식 아닌가?"
아 근데 사실 글을 쓰면서 실제 예시를 다뤄보고 나니 깨달았습니다.
코드복제는 없겠네요.
추상화시켜서 a -> b -> b 라고 하면 결괏값이 함순데?
싶지만 함수가 함수를 반환하게 되는 실제 과정을 살펴보면 다 합성과 커리잉의 연장선 아닐까 싶습니다.
g = \x -> 2 * x
에대해
f . g를 계산했다고 해봅시다.
먼저, f와 g 데이터 각각은 코드영역의 데이터일 것입니다.
f 1, f 2, f3을 하더라도 모두 다 같은 코드쪼가리에 도달해서 절차를 밟을것입니다.(하스켈의 구현에 대한 이야기)
그러면 f . g는요?
f . g에 대한 데이터는 코드영역에 박혀있지 않습니다.
하스켈이 모든 고차함수 반환값들을 힙에 저장할까요?
사실 합성의 경우는 생각하기가 용이합니다.
. 이라는 연산이 인자로 전달받은 코드를 순차실행하고,
.이라는 연산자에 두개의 코드쪼가리에 대한 참조가 전달된다면 효과적으로 데이터를 표현할 수 있습니다.
커리잉을 생각해 보죠
a -> b -> b 에 a를 대입해서 반환된 b -> b 함수는 기존의 a -> b -> b 코드를 얼마만큼 재사용할까요?
적어도 기존의 a -> b -> b 코드에다가 a 데이터를 얹은 만큼의 데이터가 필요할 것입니다.
a -> b -> b 코드는 재활용한다고하면, 코드에 대한 참조와 a 데이터 만큼의 데이터가 필요하겠네요.
합성과 커리잉에 대해 "이렇게 코드쪼가리들을 참조하면 되겠다" 를 알아보았는데요,
이 모든 질문은 이런말로 다시생각해볼수 있습니다.
"연산을 할때마다 새로운 함수들이 새로 생성된다. 자바코드로 따지자면 소스코드가 복제되는 형식 아닌가?"
아 근데 사실 글을 쓰면서 실제 예시를 다뤄보고 나니 깨달았습니다.
코드복제는 없겠네요.
추상화시켜서 a -> b -> b 라고 하면 결괏값이 함순데?
싶지만 함수가 함수를 반환하게 되는 실제 과정을 살펴보면 다 합성과 커리잉의 연장선 아닐까 싶습니다.
이건 코딩 스타일의 문제인데... CPS로 짤 수도 있는 거고...
으아.... 고닉으로 와야겠다 ... 글삭제가 안됨. 이 물음은 해결됨. 아랫글 완장님의 댓글 참조
https://gitlab.haskell.org/ghc/ghc/-/wikis/commentary/rts/haskell-execution/function-calls
요거
보십쇼
ghc단에서 어떻게 돌아가느냐가 궁금한 거면 이게 맞을듯
감사합니다 감사합니다
딱국추