# Monad

24개의 포스트
post-thumbnail

How to use Monad

어떻게 Monad를 사용해야 하는가? 사용방법 Monad 함수를 직접적으로 사용한다. flatLift, flatLift2d 언어에서 제공하는 Monad 특화된 언어를 사용한다. do(Haskell), for(Scala) 직접 사용 일반적인 명령형 언어에서 for문을 도는 방법이다. 우리는 어떠한 동작이 반복되면, 이를 함수로 만들라고 배웠다. 이렇게 반복하면서 원하는 값을 갱신하는 것도 함수의 형태로 추출할 수 있지 않을까? 위의 동작을 분석하면 위와 같다. 컨테이너를 받고, 초기 상태값을 받는다. 그리고 이를 매핑하는 변환함수를 받은 뒤, 결과값을 리턴한다. 이렇게 하면 변수, 반복문이 없는 상태로 같은일을 하는 코드를 작성할 수 있다. repeat(Lisp), foldl(Haskell), reduce(Swift) 등의 이름으로 불리는 함수이다. 고차 함수들은 다 이

2023년 8월 17일
·
1개의 댓글
·
post-thumbnail

Why Monad? Part. 02

그래서 Monad를 왜 사용하는가? 왜 차원확장 flatLift는 중요할까? 다변수를 받아 모나드를 반환하는 함수도 합성할 수 있다. f1: T1 -> M, f2: T2 -> M, g: (U1, U2) -> M 위 세 함수가 있다고 하자. 앞에서 했던 lift2d를 g에 사용해보자. (Monad는 Functor니까) 당연히 이렇게 나올 것이다. 이제 f1과 f2를 합성해보자. 이렇게 하면 f1 함수와 f2 함수를 g로 합성할 수 있게 된다. 그런데 이렇게 하면 M>가 나온다. 모나드인 경우 이걸 flat할 수 있어, 보통 원하는 결과인 M를 얻을 수 있다. 변수가 몇개이든 이런식으로 합성한 함수를 만들수 있다! 무엇을 의미하는가? 그렇다면 위처럼 연산할 수 있다는 것이 무엇이 좋은 걸까? Functor로는 다변수 함수를 합성했을 때

2023년 8월 17일
·
0개의 댓글
·
post-thumbnail

Why Monad? Part. 01

그래서 Monad를 왜 사용하는가? 왜 모나드가 유용한가? Improve High-Demensional lift Monad는 Functor의 불만족스러운 부분을 해소해준다. 앞에서 lift2d에 대해 배웠다. lift2d: ((T, U) -> V) -> (F, F) -> F> 문제는 반환 타입에 제네릭이 여러개 걸린다는 것이다. 가끔은 유용하지만 일반적으로는 불편하다. list같은 것은 유용할 수 있지만, optional같은 것은 별 쓸데가 없다. 여기서 flat을 쓰면 다중 제네릭을 제네릭 하나로 줄일 수 있다. Functor와 Monad 사이에는 Applicative Functor라는 단계가 하나 더 존재하긴 한다. 나중에 알아보자. Enabld to compose Generic-returners 위의 이유보다 더 중요한 이유가 있다. **제네릭 타입을 반환하는 함수들의 합성을 가능케

2023년 8월 17일
·
0개의 댓글
·
post-thumbnail

Monad In Programming

Monad는 어떻게 정의할 수 있을까? Monad > Monad: 다음의 연산들이 정의된 Functor > > unit: T -> M (return in Haskell) > > flat: M> -> M (join in Haskell) Functor에 unit하고 flat추가한게 모나드다. 직관적으로만 이해하고, unit, flat이 어떤 조건을 만족해야 하는지는 가장 아래에서 알아보자. Monad 함수의 추가 조건 unit, flat 함수가 가져야할 추가 조건에 대해 설명한다. Naturality for unit. T->U로 가는 함수를 f라고 정의해보자. lift함수에 f를 인자로 넣어서

2023년 8월 17일
·
0개의 댓글
·

[Kotlin Conf 2023] Kotlin & 함수형 프로그래밍: 최고를 선택하고 나머지는 건너뛰세요 - Urs Peter

서론 이 글은 KOTLINCONF' 23의 Kotlin & Functional Programming: pick the best, skip the rest by Urs Peter를 요약 & 번역한 글입니다. 오역이 있을 수 있습니다. 프로그래밍 스타일 프로그래밍 스타일은 크게 2가지로 나눌수 있다. 명령형 프로그래밍 (Imperative Programming) 명령형 프로그래밍 스타일은 상태가 변경되는 변수 선언에 의존한다. Kotlin에서는 var 키워드, loop, mutable objects, mutable collection 등의 그 예다. 표현 지향 프로그래밍 (Expression Oriented Programming) 표현 지향 프로그래밍 스타일은 그 자체가 함수형 프로그래밍은 아니지만, 기초

2023년 7월 30일
·
1개의 댓글
·

Monad 간단 소개

개요 Functional Programming 에서 에러 핸들링을 위한 기본 개념인 모나드에 대한 설명 [함수형 자바스크립트 실전 안내서] (http://www.yes24.com/Product/Goods/58181696) 내용 참고 들어가기에 앞서 함수형 프로그래밍 특징 혹은 지향점을 이야기 하자면 순수 함수 및 참조 투명성 준수라고 할 수 있다. 예) 5 = add(2,3) -> add(2,3) + 5 처럼 사용할 수 있는가? error 가 throw 되는 것은 이를 위반하는 것이다. 그렇기에 순수함수를 준수하기 위해서라도 error 가 handling 되어야 하며 이를 monad 를 통해 처리한다고 할 수 있다. 함수자 (functor) 정의(개념) 기본적인 객체로서 객체 내의 각 값을 실행할때 같은 객체를 return하는 map interface 를 구현 한 것 불안전한 값을 감싸는 container

2023년 1월 7일
·
0개의 댓글
·

[함수형 프로그래밍] 함수 체인

우리가 일반적으로 사용하는 list.map((a) ⇒ a + 1) 과 같은 것들은 모나드가 적용된 예이다. 여기서 list가 위에서 알아본 Monad 이다. Array 객체안에는 실제 heap 메모리의 시작주소(배열)를 가리키고 있는 포인터변수가 멤버변수로 있을 것이고, 그 동적할당된 배열을 조작하는 map같은 메서드가 존재한다. 이걸 통해서 javascript에서 forEach().map().reduce() 와 같은 iterable 한 객체를 체이닝해서 연산하는게 가능한것은 각각의 함수가 모나드를 리턴하기 때문이다 generator 함수 처음 호출될때 그냥 안에 있는 로직을 실행하지 않고 곧바로 generator 객체를 호출한다. 나중에 generator 객체에서 next() 연산이 이루어질 때가 되어서야 함수 안에있는 로직이 실행된다. 함수 로직을 실행하면서 처리할거 다 처리하고 값을 yield 해준다. iterable을 돌면서 한번의 스코

2022년 8월 15일
·
0개의 댓글
·

[함수형 프로그래밍] 모나드

학문적으로 모나드를 이해해보려 했지만 짧은 시간에 모나드를 이해하기는 쉽지 않았다. 그래서 모나드가 주는 가치에 대해서 실제로 모나드가 어떻게 사용되는지에 대해서 알아보면 이해가 좀 더 쉬울 수 있다. 함수형 프로그래밍은 함수의 합성을 통해서 프로그램을 이어나가는 패러다임이다. 함수를 합성할때의 문제는 리턴타입과 다음 함수에 넘겨주는 인자가 맞추어 주는것에 있다. 모나드는 이 부분에서 함수가 합성을 이어나갈 수 있는 방법을 제시한다. 우리가 자주 사용하는 javascript 에서의 Array도 모나드이다. [1, 2] 배열은 은 모나드이고, 이 모나드에 map 매서드가 구현되어 있다. 하지만 2에서 처럼 배열에 아무것도 없으면 map 함수를 돌릴 수 없지만 애러가 나진 않는다. 즉, 값이 잘못들어왔을 때(지금의 경우는 map을 돌릴 값이 없을 때) 함수를 실행시켜줄지 어떻게 할지를 판단해주는 buffer 역할을 해주는게 모나드의 역할이다. 그럼 여기서 다시한번 모나드의 개념을

2022년 8월 15일
·
0개의 댓글
·
post-thumbnail

Monad

Motive 프로젝트가 너무 바쁘다 보니 개념을 정립하고 싶어서 주말에 공부하다가, 예전에 처음 Swift를 공부할 때 빠르게 한 번 보고 지나간 모나드를 공부하기로 했다. RealmDB에서 가져온 값이 대부분 Result? 타입으로 가져오는데 무지성으로 CompactMap을 쓰는 게 싫어서 공부를 하려고 했으나 시간이 잘 나지 않았다. Context Context는 지금껏 프로그래밍을 하면서 많이 봐왔지만, 개념을 정리하는 것은 이번이 처음인 것 같다. 컨텍스트는 'Contents'를 담은 그 무엇인가를 뜻한다. 담배각에 안에 담배가 있다면 담배가 컨텐츠이고, 담배각은 컨텍스트이다. Optional As An Example 많은 서적과 블로그 자료들을 찾아보면 대부분 예를 들을 때, Optional을 예로 든다. 그 이유는 Optional이 아마 예를 만들기 가장 쉬운 Monad이기 때문인 것 같다. Optional을 Wrapp

2022년 2월 27일
·
0개의 댓글
·
post-thumbnail

읽어본 중 가장 좋았던 모나드 입문 글의 일부를 발췌하여 Haskell 대신 JavaScript로 설명한 글

- 이 글은 Translation from Haskell to JavaScript of selected portions of the best introduction to monads I’ve ever read를 번역한 글입니다. > - 매끄러운 문맥을 위하여 의역을 한 경우가 있습니다. 원문의 뜻을 최대한 해치지 않도록 노력했으니 안심하셔도 됩니다. > - 영어 단어가 자연스러운 경우 원문 그대로의 영단어를 적었습니다. > - 저의 보충 설명은 인용문 또는 괄호 안에 역자 주 문구를 통하여 달았습니다. (John Gruber와 [A Neighborhood o

2022년 2월 22일
·
0개의 댓글
·

[컨퍼런스] NAVER D2 - 모나드(Monad)란 무엇인가?

본 포스팅은 유튜브 naver d2 채널의 Monad란 무엇인가? 영상을 보고 작성하였습니다. Functor 그럼 값을 꺼낼 수도 없고, 할 수 있는 일이라고는 map() 메소드로 값을 변경하는 것 뿐인 군더더기 같은 Functor를 왜 쓰는 걸까? 이유 1 Functor를 이용하면 일반적으로 모델링할 수 없는 상황을 모델링할 수 있다. 값이 없는 케이스 값이 미래에 준비될 것으로 예상되는 케이스 이유 2 Functor를 이용하면 함수들을 손쉽게 합성할 수 있다. 값이 없는 케이스 실제 사용 null 값이 들어있음에도 일반 문자열이 있는 것처럼 map 함수를 적용할 수 있고 parseInt 함수를 전달할 수 있다. 이것은 값이 들어있는 아래 케이스와 완전히 동일한 로직이다. 사용하는 쪽에서 null check가 불필요하며, null 인 경우 그냥

2022년 2월 2일
·
0개의 댓글
·
post-thumbnail

Functor & Monad

함수형 프로그래밍을 공부하다보면 벽을 한번 마주한다. Functor와 Monad가 그것이다. 이걸 이해하기 위해서 위키피디아에서 집합론?, 범주론? 이런 걸 읽었던 적이 있는 것 같은데 여전히 잘 모르겠다. 이번에는 와닿는 방식으로 이해하는 것을 목표로 한다. Functor optional의 map 값이 있으면 실행, 없으면 말아 Collection의 map 값을 하나씩 가지고와서 매핑해라 Dictionary의 map 각 딕셔너리의 key, value를 tuple로 들고와서 매핑해라 function의 map Composition 해라 map을 이용한 transform을 지원하는, value를 가지는 context Context + value + transform(map) = Functor context 어떤 value가 처해있는 상태 Collection, Optional 등 다른 값을 가지는 Cont

2022년 2월 2일
·
0개의 댓글
·
post-thumbnail

High Order Function

자주 사용하는 고차함수들에 대해서 이해해보자.map, flatMap과 같은 경우는 여러가지가 존재하는데, 각각의 활용 방법에 대해서 알아보자. 각각의 고차함수의 Documnentation을 모두 달아두었으니, 한번씩 읽어보는 것을 잊지말자. Documentation 확인 Sequence forEach filter reduce -

2022년 2월 2일
·
0개의 댓글
·
post-thumbnail

모나드(monad)가 대체 뭘까?

스위프트 책을 공부하면서 이게 대체 뭔 소리지? 싶었던 건 굉장히 드문 일이었는데... 오늘 공부하면서 '모나드'라는 개념을 이해하는 게 너무나 어려웠다. 왜냐면 낯선 단어에 처음 듣는 내용이었기 때문... 😒 회사에서 짬 시간에 공부를 하기 때문에 바로 찾아보긴 어려웠고 그냥 아 그런가보다... 하고 필기 정리만 했다. > 모나드 = 자신의 컨텍스트와 같은 형태로 맵핑할 수 있는 함수 객체 = 닫힌 함수 객체 💊 모나드의 사전적 정의 퇴근하고 집에 와서... 할 일을 좀 하고 궁금했던 것에 대해 더 찾아보려는데 더 미궁 속으로 빠져드는 기분이다. 😢 가방 끈이 짧아서 그런지 용어 자체도 처음 들었는데, 알고 보니 굉장히 다양한 분야에서 사용되는 용어였다. 범주론(範疇論, 영어: category theory)은 수학

2021년 8월 24일
·
0개의 댓글
·
post-thumbnail

Swift.Monad

스위프트 프로그래밍 3판을 보고 정리한 내용입니다. 모나드란? > 순서가 있는 연산을 처리할 때 자주 활용되는 디자인 패턴 > > 사용하는 곳에 따라 수학의 범주론에서 말하는 모나드인지 특정 디자인 패턴을 따르는 모나드인지가 다르다. 모나드가 갖춰야 할 조건 타입을 인자로 받는 타입(특정 타입의 값을 포장) 특정 타입의 값을 포장한 것을 반환하는 함수(메서드)가 존재 포장된 값을 변환하여 같은 형태로 포장하는 함수(메서드)가 존재 컨텍스트 > 컨텍스트란 '맥락', '전후 사정' 등이다. > > 컨텍스트는 컨텐츠를 담은 무언가를 뜻한다. > > 예를 들면 물이 컨텐츠고 물컵이 컨텍스트이다. 함수 객체 > 고차함수인 map을 적용 할 수 있는 컨테이너 타입 모나드 > 함수객체 중에서 자

2021년 8월 19일
·
0개의 댓글
·
post-thumbnail

kotlin과 arrow를 이용한 functional polymorphic programming

functional polymorphic programming using kotlin & arrow kotlin + spring webflux + arrow 를 이용해 functional polymorphic한 architecture로 http server를 구축해보는 실습 코드입니다. github Reactor & Monad spring webflux가 사용하고 있는 reactor framework는 reactive stream API를 구현한 구현체 중 하나이다. reactor에서 제공하는 Mono와 Flux를 이용하면 non-blocking io를 기반으로 높은 동시성을 가진 어플리케이션을 작성할 수 있다. Mono와 Flux를 이용해 어플리케이션을 작성하면 map과 flatMap을 굉장히 많이 쓰게 되는데, 이 flatMap은 FP에서 굉장히 중요하게 다뤄지는 Monad

2021년 5월 31일
·
1개의 댓글
·
post-thumbnail

함수 합성과 참조 투명성

분할하여 정복하라 가장 유명한 알고리즘 중 하나는 분할정복이다. 말 그대로, 문제를 잘게 쪼개여 풀어내는 것이다. 우리가 무심코 사용하는 복잡한 함수는 실제로는 여러가지 함수로 쪼갤 수 있는 경우가 잦다. 다음과 같은 예시를 생각해보자. 위 예시는 다음과 같이 고쳐서 쓸 수 있다. 어떤가, 좀 더 간결한 것이 느껴지는가? 위 식은 계산의 본질만 담아내고 있다. for-loop도 계산의 본질과는 떨어져 있다. 위 식의 좋은 점은 또 하나 있다. 바로 상태가 없다는 것이다. 왜 상태가 없어야하는가? 질문을 바꾸어보자. 어째서 상태는 해로운가? 우선 데이터 레이스를 유발할 수 있다. 이를 해결하기 위해서는 공유되는 자원의 소유권을 취득하고, 잠그고하는 등의 복잡한 과정이 필요하

2021년 2월 28일
·
0개의 댓글
·
post-thumbnail

PBT로 FP 법칙 확인해보기 - Monad

Monad Functor가 map을 가지고 있는 자료 구조들을 일반화한 특질인 것 처럼, Monad는 unit과 flatMap을 가지고 있는 자료구조를 일반화한 특질이다. Monad 만들기 arrow의 kind를 이용해서 Functor를 만들었던 것처럼 monad도 비슷한 방식으로 인터페이스를 정의해볼 수 있다. 한가지 흥미로운 점은, Functor에 등장하는 map 함수는 Monad의 unit과 flatMap을 이용해 아래와 같이 구현할 수 있다는 점이다. map(f) == flatMap(a => unit(f(a))) 그러므로 Monad 인터페이스는 Functor 인터페이스를 상속하도록 하고, map 함수에 대해서는 default method를 제공해줄 수 있다. 그리고 Functor에서 했던 것과 같이 다양한 타입 생성자에 대해 Monad 인스턴스를 작성할 수 있다. PBT로 Monad 법칙 확인해보기 결합법칙 모든 Mon

2021년 2월 13일
·
0개의 댓글
·
post-thumbnail

PBT로 FP 법칙 확인해보기 - Functor

Functor 우리는 함수형 프로그래밍 패러다임을 지원하는 많은 언어에서 다양한 자료 구조에 대해 map 함수를 지원하는 것을 알고 있다. 이러한 이른바 "map 함수를 구현하는 자료 구조"를 일반화한 특질을 Functor라고 부른다. Functor 만들기 functor는 어떤 형식(type)에 대한 것이 아니라 형식 생성자(type constructor)에 대한 것인데, 코틀린에서는 이 형식 생성자를 generic하게 표현하는 방법을 지원하지 않는다. 대표적인 함수형 언어인 스칼라에서는 상위 형식 생성자(higher kinded type)라고 불리는 개념을 기본 syntax로 제공하는데, 코틀린에서 이 higher kinded type을 표현하기 위해서는 코틀린 함수형 라이브러리인 arrow의 힘을 빌려야 한다. higher kinded type을 표현하기 위해 arrow에서 제공하는 Kind 형식을 사용해 Functor 인터페이스를 아래와 같이 작성할 수 있다.

2021년 2월 11일
·
0개의 댓글
·

Functor와 Monad

요즘 레츠스위프트를 구독하면서 여러가지 소식들을 접하고 있다. 여러 소식 중에 함수형 프로그래밍과 관련된 글을 그저께 읽다가 Functor와 Monad를 다시 접하게 되었다. 이 친구들은 기술 면접 준비하다가 몇번 스치다가 말았던 부분인데, 시간도 많으니! 이번 기회에 공부해보자라는 생각을 하게되었다. Swift와 관련된 글을 찾고 싶어 구글링을 하니 2가지 좋은 글을 찾을 수 있었다. Swift Monads, Functors and Applicatives with examples [Swift Functors, Ap

2021년 1월 29일
·
0개의 댓글
·