Leia a seção sobre como o compilador lida com forexpressões na referência de linguagem. Pode dar algumas dicas.
Dirk
@tstenner: Desde que estejamos nos apoiando em memes concisos: o Google é seu amigo.
Chuck
4
@aishwarya É mais como "Apenas use mapa plano em sua lista / matriz / opção", não "merda" como em "ruim"
tstenner
1
Na verdade, aquela frase específica foi (é claro) tirada do contexto, onde alguém perdeu a mônada Bar (Reader) em algum lugar de Manhattan ;-) Como acontece nesses casos, a versão curta pegou.
Roland Kuhn
Respostas:
55
O raciocínio por trás dessa frase é que você pode substituir uma grande quantidade de código if / then / else tedioso que você escreveria por chamadas para flatMap (e outras funções de ordem superior).
Mas se aplica a outras mônadas também (embora eu deva admitir, eu mesmo não entendo exatamente os detalhes)
Imagine a situação em que você tem uma coleção para a qual deseja aplicar uma função (ou uma série de funções) em que cada função pode retornar nulo. Quando você realmente usa null, seu código será repleto de verificações de null. Mas se você usar Opções em vez de valores, você pode simplesmente mapear os valores com as funções desejadas, encadeando as funções no caso de funções múltiplas e obter uma coleção apenas com os resultados que não são nulos, o que em muitos casos é exatamente o que você quer.
Uma vez que essa descrição é um tanto complicada, o conselho mais curto "apenas um mapa plano que merda" se estabeleceu.
Eu pessoalmente uso a lista mônada às vezes para lidar com combinações.
Dan Burton
103
A história que ouvi foi que dois proeminentes programadores de Scala estavam se juntando quando um deles começou a escrever algum código como este:
option match{caseSome...
Nesse ponto o outro disse "O que é isso? Hora de amador? Mapa plano que merda!"
Quanto ao que é tão poderoso flatMap, bem ... Primeiro, é o operador monádico fundamental. Isso significa que é uma operação comum compartilhada por, por exemplo, contêineres (como Optioncoleções, etc), continuações, estado, etc. Em segundo lugar, embora você possa desconstruir uma Option, que, ao contrário flatMap, não é uma operação monádica , por isso não pode ser tão amplamente aplicado. Além disso, requer muito conhecimento sobre os dados que você está manipulando.
Nota: anteriormente, eu disse que a correspondência era mais lenta do que flatMap- o oposto é verdadeiro, até a versão mais recente do Scala no momento da redação deste artigo, 2.10.1.)
Esses dois programadores éramos eu e Paul Chiusano.
Apocalisp
1
Se bem me lembro, #legendofklang não estava se manifestando no Twitter na mesma época ... o que costuma ser a raiz da atribuição incorreta do mapa plano que merda de meme? Devemos fazer algum tipo de entrada no wiki do meme Scala; existem alguns incríveis agora!
timóteo
3
@WillSargent Acho que está faltando a floresta para as árvores. A vantagem é que ele compõe . Se tenho uma função que depende de quatro mônadas, posso escrever val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d). Posso adicionar mais mônadas, remover mônadas e tudo permanece o mesmo. Além disso, observe que ele não se decompõe em String, mas em Option[String]. Embora, na verdade, ele não se decomponha. Uma das razões pelas quais algumas pessoas não gostam de usar recipientes como exemplos para mônadas é que você pode tirar coisas de recipientes, mas nem todas as mônadas permitem que você faça isso.
O mais importante flatMapé que é a representação de Scala da operação de vinculação monádica. Existem vários tutoriais na web que explicam o propósito das mônadas e por que exatamente elas são tão úteis; James Iry tem um que apresenta alguns detalhes.
Acho que esta é a resposta correta, Optioné apenas um dos muitos flatMapcasos de uso. Claro, se você quiser observar mônadas em seu "habitat natural", você deve dar uma olhada em Haskell. A única diferença é que os Haskellers dizem: "Apenas >> = essa merda!"
Landei
Obrigado pelo link do artigo, achei muito útil. Eu também voltei ao capítulo "For expressões revisitadas" em Programação em Scala, que lança alguma luz sobre loops for e seu uso de filter, map, flatMap e flatten.
Guillaume Belrose
10
Runar Bjarnason é a pessoa que você está procurando para a origem.
Perceber por que é tão poderoso é algo que só pode vir com o tempo, para ser honesto. A classe Option é o melhor lugar para começar a ver como você faria flatMap repetidamente em uma série de pesquisas (por exemplo) em um resultado final.
for
expressões na referência de linguagem. Pode dar algumas dicas.Respostas:
O raciocínio por trás dessa frase é que você pode substituir uma grande quantidade de código if / then / else tedioso que você escreveria por chamadas para flatMap (e outras funções de ordem superior).
Isso é especialmente verdadeiro para Opções (consulte http://tonymorris.github.io/blog/posts/scalaoption-cheat-sheet/ )
Mas se aplica a outras mônadas também (embora eu deva admitir, eu mesmo não entendo exatamente os detalhes)
Imagine a situação em que você tem uma coleção para a qual deseja aplicar uma função (ou uma série de funções) em que cada função pode retornar nulo. Quando você realmente usa null, seu código será repleto de verificações de null. Mas se você usar Opções em vez de valores, você pode simplesmente mapear os valores com as funções desejadas, encadeando as funções no caso de funções múltiplas e obter uma coleção apenas com os resultados que não são nulos, o que em muitos casos é exatamente o que você quer.
Uma vez que essa descrição é um tanto complicada, o conselho mais curto "apenas um mapa plano que merda" se estabeleceu.
fonte
A história que ouvi foi que dois proeminentes programadores de Scala estavam se juntando quando um deles começou a escrever algum código como este:
Nesse ponto o outro disse "O que é isso? Hora de amador? Mapa plano que merda!"
Quanto ao que é tão poderoso
flatMap
, bem ... Primeiro, é o operador monádico fundamental. Isso significa que é uma operação comum compartilhada por, por exemplo, contêineres (comoOption
coleções, etc), continuações, estado, etc. Em segundo lugar, embora você possa desconstruir umaOption
, que, ao contrárioflatMap
, não é uma operação monádica , por isso não pode ser tão amplamente aplicado. Além disso, requer muito conhecimento sobre os dados que você está manipulando.Nota: anteriormente, eu disse que a correspondência era mais lenta do que
flatMap
- o oposto é verdadeiro, até a versão mais recente do Scala no momento da redação deste artigo, 2.10.1.)fonte
val res = for (a <- ma; b <- mb; c <- mc; d <- md) yield f(a,b,c,d)
. Posso adicionar mais mônadas, remover mônadas e tudo permanece o mesmo. Além disso, observe que ele não se decompõe emString
, mas emOption[String]
. Embora, na verdade, ele não se decomponha. Uma das razões pelas quais algumas pessoas não gostam de usar recipientes como exemplos para mônadas é que você pode tirar coisas de recipientes, mas nem todas as mônadas permitem que você faça isso.O mais importante
flatMap
é que é a representação de Scala da operação de vinculação monádica. Existem vários tutoriais na web que explicam o propósito das mônadas e por que exatamente elas são tão úteis; James Iry tem um que apresenta alguns detalhes.fonte
Option
é apenas um dos muitosflatMap
casos de uso. Claro, se você quiser observar mônadas em seu "habitat natural", você deve dar uma olhada em Haskell. A única diferença é que os Haskellers dizem: "Apenas >> = essa merda!"Runar Bjarnason é a pessoa que você está procurando para a origem.
Perceber por que é tão poderoso é algo que só pode vir com o tempo, para ser honesto. A classe Option é o melhor lugar para começar a ver como você faria flatMap repetidamente em uma série de pesquisas (por exemplo) em um resultado final.
fonte