devEvan
1k
2020-01-28 09:10:01 작성 2020-01-28 10:13:22 수정됨
5
1017

어떻게 하면 안전하게 함수를 합성할 수 있을까?


함수형 프로그래밍에서는 함수의 동작을 예측하고 안전하게 합성하기 위해서 순수 함수를 사용합니다.

하지만 아무리 순수 함수를 사용한다고 해도 결국 프로그래밍으로 구현한 것이니 에러가 나는 예외 상황은 발생할 수 밖에 없고, 에러가 발생하면 함수를 합성하여 진행하는 연산 전체가 망해버리게 되죠😢

그래서 이번에는 이런 사이드 이펙트를 어떤 방법으로 관리하며 함수를 안전하게 합성할 수 있는지에 대한 포스팅을 작성하였습니다🙂

ps. 이 포스팅은 수학을 잘 모르시는 분들이 봐도 카테고리에 대한 이해를 할 수 있도록 많은 부분이 생략되고 단순화되었습니다! 그에 따른 디테일한 정의에 대한 오류가 있을 수 있으니 양해부탁드립니다! 🙏


https://evan-moon.github.io/2020/01/27/safety-function-composition/

4
3
  • 댓글 5

  • 군리미
    171
    2020-01-28 10:36:06

    포스팅 잘 읽고 있습니다.

    이번 글 굉장히 감명깊게 읽었습니다.

    댓글쓰러 로그인하는게 정말 오랜만이네요.

    감사합니다.

    0
  • fender
    16k
    2020-01-28 11:26:52

    주로 스칼라 언어로 함수형 언어를 공부하는 입장에서 읽다보니 조금 흥미로운 내용이 보였습니다. 스칼라나 해스켈 기반의 함수형 개념에서는 원문에서 '박스'나 '문맥'으로 표현하신 내용은 '펑터'보다는 '타입 클래스'로 표현하고, 펑터는 매핑 동작을 지원하는 타입 클래스의 일종으로 정의하고 있습니다:


    수학을 깊게 공부하진 않아서 작성하신 글에서의 펑터에 대한 정의가 보다 집합론에 가까운 것인지, 아니면 단순히 구현 언어의 차이인지, 혹은 저나 devEvan님의 오해인지 잘모르겠네요.

    여담이지만, 개인적으로 생각하는 함수형 패러다임의 핵심은 프로세스를 추상화한다는 개념인 것 같습니다. 즉, 객체지향이 주로 구조나 관계에 대한 추상화 도구라면, 함수형은 프로세스 자체를 선언적이고 합성 가능하며, 맥락(context)과 무관하게 추상화 하는 도구가 아닐까 싶습니다.

    그런 관점에서 부작용에 대한 안전성보다도 본문에서도 '문맥'이나 '박스'로 설명된 부분이 더 중요한 내용이 아닌가 싶습니다.

    명령형 패러다임에 익숙했을 때 'List<T>'는 그냥 '값을 담는 자료형'일 뿐이었지만, 이를 값에 대한 특정 '맥락', 또는 그런 맥락을 제공하는 타입 생성자로 보는 관점을 배웠을 때 조금이라도 함수형을 이해하는데 많은 도움이 되었던 기억이 있습니다.

    아직 함수형에 대한 관심도가 높지 않은데 지속적으로 양질의 내용을 올려주셔서 감사드립니다. 앞으로도 좋은 내용 기대하겠습니다.

    1
  • Frudy
    4k
    2020-01-28 21:33:47

    좋은내용 감사합니다.

    함수지향이 뭐에여? 왜써여? 라고 누가 물어보면 아직도 답을 못하고있는데,

    잘 참고하겠습니다.

    0
  • kenu
    47k
    2020-01-29 01:46:56

    좋은 글 감사합니다.

    저는 함수는 레이어(경우의 수 제어)라고 생각하는데, 함수를 합성하는 것은 차례로 놓는 +(serial)가 아니라 x(곱하기)이겠지요.

    A레이어 함수는 경우의 수가 2이고 B함수는 경우의 수가 4일 경우 합성하면, 2x4=8로 늘어 나는데, ...

    Abstract까지 안 가더라도 Interface로 강제하는 게 예외를 줄이는 방법이 아닌가 다시 생각해봅니다.

    g middot f에 대한 이미지 검색결과

    chegg는 답을 보려면 결제해야 되네요. 쯔압


    0
  • fender
    16k
    2020-01-29 08:42:56

    kenu // '경우의 수'는 아마도 본문에서 언급한 정의역과 치역에 대한 부분일 것 같은데 인터페이스는 잘 모르겠네요. 언어에 따라 함수를 `Function1<T, R>` 처럼 인터페이스로 표현하는 경우가 있긴 한데 정확하게 함수 합성과 관련해서 어떻게 연관되는지는 설명이 필요할 것 같습니다.

    사실 함수형 패러다임이라는 맥락에서 말하는 '함수의 합성(composition)'은 매우 단순한 개념입니다.

    이는 원문의 설명대로 함수 f와 g가 있을 때 f의 결과를 g의 입력으로 사용하도록 g(f(x)) 처럼 결합하는 걸 뜻하고, 조금 더 넓은 의미로는 g(x).map(f)와 같이 펑터 등을 포함해서 비슷한 결과를 내는 결합까지 포함합니다.

    아마도 처음 함수형을 배우는 분들의 경우 합성 자체를 이해하는 것 보다는 '그래서 그걸 어디에 활용해야 하는가' 하는 부분이 더 막연하게 느껴질 수 있을 것 같습니다.

    그래서 함수형을 처음 접한다면 함수의 합성이라는 개념을 너무 복잡하게 생각하기 보다는 그 활용도에 대한 부분에 조금 더 집중하면 도움이 될 수 있다고 생각합니다.

    0
  • 로그인을 하시면 댓글을 등록할 수 있습니다.