Pergunta

Esta pergunta não se destina como isca de chama! Como pode ser aparente, eu tenho olhado Scalraz recentemente. estou tentando entender Por quê Eu preciso de parte da funcionalidade que a biblioteca fornece. Aqui está algo:

import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList

Eu coloquei algumas declarações impressas em minhas funções para ver o que estava acontecendo (Além: o que eu teria feito se estivesse tentando evitar efeitos colaterais como esse?). Minhas funções são:

val f: NEL[Int] => String    = (l: NEL[Int]) => {println("f: " + l); l.toString |+| "X" }
val g: NEL[String] => BigInt = (l: NEL[String]) => {println("g: " + l);  BigInt(l.map(_.length).sum) }

Então eu os combino através de um Cokleisli e passar em um NEL[Int]

val k = cokleisli(f) =>= cokleisli(g)
println("RES: "  + k( NEL(1, 2, 3) ))

O que essa impressão faz?

f: NonEmptyList(1, 2, 3)
f: NonEmptyList(2, 3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1, 2, 3)X, NonEmptyList(2, 3)X, NonEmptyList(3)X)
RES: 57

O valor RES é a contagem de caracteres dos elementos (string) no NEL final. Duas coisas me ocorrem:

  1. Como eu poderia saber que meu NEL seria reduzido dessa maneira das assinaturas de método envolvidas? (Eu não estava esperando o resultado de forma alguma)
  2. Qual é o objetivo disso? Um caso de uso razoavelmente simples e fácil de seguir pode ser destilado para mim?

Esta pergunta é um apelo de vendas finas para uma pessoa adorável como retrônimo Para explicar como essa poderosa biblioteca realmente funciona.

Foi útil?

Solução

A maneira "correta" de fazer isso é definitivamente para coletar os dados como é inserido!

Um dos maiores problemas com a abordagem que você sugere é que para tabelas maiores simplesmente não funcionará porque se uma célula de exibição de tabela estiver fora da tela, você não poderá acessá-lo ou os controles / visualizações que ele contém(e pode ainda existir ainda!).

Outras dicas

Co -Jeoin também é definido para scalaz.tree e scalaz.treeloc. Isso pode ser explorado Para encontrar um fluxo de todos os caminhos da raiz da árvore para cada nó foliar.

def leafPaths[T](tree: Tree[T]): Stream[Stream[T]]
  = tree.loc.cojoin.toTree.flatten.filter(_.isLeaf).map(_.path)

Usando composição de seta cokleisli, podemos fazer isso, por exemplo:

def leafDist[A] = (cokleisli(leafPaths[A]) &&& cokleisli(_.rootLabel))
  =>= (_.map(s => (s._2, s._1.map(_.length).max)))

leafDist pega uma árvore e retorna uma cópia dela com cada nó anotado com sua distância máxima de uma folha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top