관리 메뉴

HAMA 블로그

스칼라 강좌 (27) - 모나드 (Monad) 본문

Scala

스칼라 강좌 (27) - 모나드 (Monad)

[하마] 이승현 (wowlsh93@gmail.com) 2016. 11. 8. 11:20


- https://github.com/enshahar/BasicFPinScala/blob/master/Intermediate/Monad.md

- https://github.com/enshahar/BasicFPinScala/blob/master/Intermediate/Monad_Rules.md

Monad Programming with Scala Future

http://www.haruair.com/blog/2986

http://blog.seulgi.kim/2015/07/what-is-monad.html

- 자바언어로 서술한 Functor 와 모나드 

 제 능력이 부족한 관계로 위의 글로써 대신합니다. (모나드 관련 한글 블로그 모음) 

 아참! 위의 글을 읽기 전에 반드시 모나드 괴담!을 읽어보세요. ^^


모나드가 무엇인지 이해함으로써 하스켈 프로그래머가 되겠다는 것은 "악기란 무엇인가?"를 이해하면 모든 악기의 연주자가 될 수 있으리라는 믿음과 같다. 즉 모나드를 이해하는것과 프로그래밍을 잘하는것과는 별개의 문제.
Fallacy (2015)


모나드 간단 정리
(코딩하다 보면 아 대략 이러면 모나드다 정도면 될 거 같습니다. 완벽한 모나드의 법칙을 이해 할 필요까지는 없을듯) 

1.모나드는 다른 타입을 인자로 받는 타입이다. 

case class Boxed[T](value:T);

2.모나드 타입의 값을 생성하는 함수가 있어야 한다.

def initBoxed(x:Int):Boxed[Int] = Boxed(x)
def initLogged(x:Int):Logged[Int] = Logged(x, List())
def initMyOption(x:Int):MyOption[Int] = MySome(x)

3.다른 모나드 타입으로 진행하는 함수가 있어야 한다. (또한 감싼 값에 대해서 꺼낼 수 있는 방법을 제공하며 꺼낸 값을 가지고 원하는 형식으로 변형하고 다시 감싸서 반환)

session => Future[User]
=> flatMap => (User => Future[Order])
=> flatMap => (Order => Future[List[Item]])

위의 3가지 성질을 모두 가지고 있을때 모나드라 칭한다.

* 스칼라 Future 는 모나드가 아니다.=> https://stackoverflow.com/questions/27454798/is-future-in-scala-a-monad


아래의  자바스크립트의 예를 보면 대략 모두 가지고 있음을 알 수 있다. 

// 타입 스크립트로 Monad의 인터페이스를 설계함
interface MStatic<T> {
    // constructor that wraps value
    new(value: T): M<T>;
}

interface M<T> {
    // bind as an instance method
    bind<U>(transform: (value: T) => M<U>): M<U>;
}


 

Comments