Scala의 "flatmap that s ***"관용적 표현은 어디에서 왔습니까?


104

스칼라 민속에서 그런 자리를 차지할만한 플랫 맵의 강력한 점은 무엇입니까?


30
[인용 필요]
tstenner

1
컴파일러가 for언어 참조에서 표현식을 처리하는 방법에 대한 섹션을 읽으십시오 . 힌트를 줄 수 있습니다.
Dirk

@tstenner : 간결한 밈에 의존하는 한 Google은 당신의 친구입니다.
Chuck

4
@aishwarya 그것은 더 "나쁜"에서와 같이 "목록 / 배열 / 옵션에서 그냥 사용 flatmap"가 아니라 "똥"같은거야
tstenner

1
사실, 그 특정 문구는 (물론) 문맥에서 벗어 났는데, 누군가가 맨해튼 어딘가에서 Bar (Reader) 모나드를 놓친 곳입니다. ;-) 그런 경우에 발생하는 것처럼 짧은 버전이 멈췄습니다.
Roland Kuhn

답변:


55

이 문구 뒤에있는 이유는 flatMap (및 기타 고차 함수)에 대한 호출로 작성하는 지루한 if / then / else 코드를 많이 대체 할 수 있기 때문입니다.

이것은 특히 옵션의 경우에 해당됩니다 ( http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ 참조 )

그러나 그것은 다른 모나드에도 적용됩니다 (정확히 인정해야하지만 아직 세부 사항을 정확히 이해하지는 못합니다)

각 함수가 null을 반환 할 수있는 함수 (또는 일련의 함수)를 적용하려는 컬렉션이있는 상황을 상상해보십시오. 실제로 null을 사용하면 코드가 null 검사로 가득 차게됩니다. 그러나 값 대신 옵션을 사용하는 경우 원하는 함수로 값을 평면 매핑하고 여러 함수의 경우 함수를 연결하고 null이 아닌 결과만으로 컬렉션을 얻을 수 있습니다. 당신이 원합니다.

그 설명이 다소 복잡하기 때문에 "그냥 플랫 맵"이라는 짧은 조언이 확립되었습니다.


저는 개인적으로 목록 모나드를 가끔 사용하여 조합을 처리합니다.
Dan Burton 2011

103

내가 들었던 이야기는 두 명의 뛰어난 Scala 프로그래머 중 한 명이 다음과 같은 코드를 작성하기 시작했을 때 짝을 이룬다는 것입니다.

option match {
    case Some ...

어느 시점에서 다른 사람이 "이게 뭐야? 아마추어 시간? 평면지도 그거!"

에 대한 강력한 기능에 관해서 flatMap는 ... 첫째, 기본 모나드 연산자입니다. 이는 예를 들어 컨테이너 (예 : Option, 컬렉션 등), 연속, 상태 등에 의해 공유되는 일반적인 작업임을 의미합니다 . 둘째,를 분해 할 수 있지만 Option,는, 반대로 flatMap모나드 작업이 아닙니다. , 따라서 널리 적용될 수 없습니다. 또한 조작하는 데이터에 대한 지식이 너무 많이 필요합니다.

참고 : 이전에 일치가 더 느리다고 말했습니다. flatMap사실이 글을 쓰는 시점의 가장 최근 버전 인 2.10.1까지 그 반대가 사실입니다.)


4
나는 :-) 그때 아마추어 시간에 나는 아직도 생각
기욤 Belrose에게

69
그 두 프로그래머는 저와 Paul Chiusano였습니다.
Apocalisp

1
내가 정확하게 기억한다면, #legendofklang이 거의 같은시기에 트위터에 드러나지 않았던가 ... 그것이 종종 밈을 망친 플랫 맵의 잘못된 속성의 근원이 되는가? 우리는 Scala meme wiki 항목을 만들어야합니다. 이제 멋진 것들이 있습니다!
timothy

3
@WillSargent 나는 그것이 나무를 위해 숲을 놓치고 있다고 생각합니다. 장점은 구성 하는 것 입니다. 4 개의 모나드에 의존하는 함수가 있다면 val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). 더 많은 모나드를 추가하고, 모나드를 제거해도 동일하게 유지됩니다. 또한로 분해되지 않고로 분해 String됩니다 Option[String]. 사실, 그것은 전혀 분해되지 않습니다. 일부 사람들이 컨테이너를 모나드의 예로 사용하는 것을 좋아하지 않는 이유 중 하나는 컨테이너에서 물건을 꺼낼 수 있지만 모든 모나드가 그렇게 할 수있는 것은 아니기 때문입니다.
Daniel C. Sobral

1
다음에서 인용 된 토론 링크를 볼 수 있습니다. web.archive.org/web/20130627111326/http://beust.com/weblog/2010/…
hawkeye

12

중요한 점은 flatMapScala의 모나 딕 바인딩 작업 표현이라는 것입니다. 웹에는 모나드의 목적과 그것이 왜 그렇게 유용한 지 설명하는 수많은 튜토리얼이 있습니다. James Iry는 몇 가지 세부 사항에 대해 설명합니다.


4
나는 이것이 정답이라고 생각 Option하며 많은 flatMap사용 사례 중 하나에 불과 합니다. 물론, "자연 서식지"에서 모나드를 관찰하고 싶다면 Haskell을 확인해야합니다. 유일한 차이점은 Haskellers가 "그냥 >> = 저거!"라고 말하는 것입니다.
Landei

기사 링크에 감사 드리며 매우 유용하다는 것을 알았습니다. 또한 Programming in Scala의 "For expressions revisited"장으로 돌아가서 for 루프와 필터, 맵, flatMap 및 flatten 사용에 대해 설명했습니다.
Guillaume Belrose 2011

10

Runar Bjarnason은 원산지를 찾고있는 사람입니다.

그것이 왜 그렇게 강력한 지 깨닫는 것은 정직하게 시간이 지나야 올 수있는 것입니다. Option 클래스는 일련의 조회 (예 :)를 최종 결과로 반복적으로 flatMap하는 방법을보기위한 시작하기에 가장 좋은 곳입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.