0Pricing
Scala for Backend Engineering & Functional Programming · Aula

Currying

Aplicação parcial.

Currying é uma aula grátis de Scala for Backend Engineering & Functional Programming no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Scala for Backend Engineering & Functional Programming, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que é curry?

Curry transforma uma função com vários argumentos em uma cadeia de funções, cada uma recebendo um argumento. No Scala, isso é escrito com várias listas de parâmetros.

object Main {
  def add(a: Int)(b: Int): Int = a + b
  def main(args: Array[String]): Unit = {
    println(add(3)(4))
  }
}

Várias listas de parâmetros

Um método com curry tem várias listas de parâmetros: def f(a: Int)(b: Int). Você o chama fornecendo cada lista por vez: f(1)(2).

object Main {
  def combine(prefix: String)(value: Int): String = s"$prefix$value"
  def main(args: Array[String]): Unit = {
    println(combine("id-")(42))
  }
}

Aplicação parcial

Você pode aplicar apenas algumas listas de argumentos e receber de volta uma função que aguarda o restante. Isso se chama aplicação parcial.

object Main {
  def add(a: Int)(b: Int): Int = a + b
  def main(args: Array[String]): Unit = {
    val addFive = add(5) _
    println(addFive(10))
    println(addFive(20))
  }
}

Especializando uma função geral

A aplicação parcial permite criar funções especializadas a partir de uma função geral, reduzindo a repetição.

object Main {
  def power(exp: Int)(base: Int): Int = math.pow(base, exp).toInt
  def main(args: Array[String]): Unit = {
    val square = power(2) _
    val cube = power(3) _
    println(square(5))
    println(cube(2))
  }
}

Aplicando curry a uma função normal

Um valor de função comum tem um método .curried que o converte para a forma com curry.

object Main {
  def main(args: Array[String]): Unit = {
    val add = (a: Int, b: Int) => a + b
    val curriedAdd = add.curried
    println(curriedAdd(3)(4))
  }
}

Desfazendo o curry

O auxiliar Function.uncurried desfaz o processo, transformando uma função com curry novamente em uma função com uma única lista de parâmetros.

object Main {
  def main(args: Array[String]): Unit = {
    val curried: Int => Int => Int = a => b => a + b
    val normal = Function.uncurried(curried)
    println(normal(3, 4))
  }
}

Por que o curry é útil

O curry permite a reutilização: fixe os primeiros argumentos uma vez e depois chame o resultado várias vezes com diferentes argumentos restantes. Ele também ajuda o compilador a inferir tipos nas listas seguintes.

object Main {
  def discount(rate: Double)(price: Double): Double = price * (1 - rate)
  def main(args: Array[String]): Unit = {
    val blackFriday = discount(0.3) _
    println(blackFriday(100))
    println(blackFriday(250))
  }
}

Inferência de tipos na última lista

Um motivo prático para usar várias listas de parâmetros: o compilador pode inferir os tipos dos parâmetros da lambda a partir das listas anteriores, permitindo omiti-los.

object Main {
  def fold[A](xs: List[A])(init: A)(op: (A, A) => A): A =
    xs.foldLeft(init)(op)
  def main(args: Array[String]): Unit = {
    val total = fold(List(1, 2, 3))(0)((a, b) => a + b)
    println(total)
  }
}

Curry com três listas

Você pode ter quantas listas de parâmetros quiser. Cada chamada fornece uma lista e retorna uma função para a próxima.

object Main {
  def make(a: Int)(b: Int)(c: Int): Int = a + b + c
  def main(args: Array[String]): Unit = {
    println(make(1)(2)(3))
    val step = make(10) _
    println(step(20)(30))
  }
}

Construindo validadores configuráveis

Um uso real comum: aplicar curry a uma regra de validação, fixar o limite e reutilizar o predicado resultante em um conjunto de dados.

object Main {
  def atLeast(min: Int)(value: Int): Boolean = value >= min
  def main(args: Array[String]): Unit = {
    val adult = atLeast(18) _
    println(List(15, 21, 18, 12).map(adult))
  }
}

Curry e aplicação parcial

Curry é a transformação estrutural em funções de um argumento. Aplicação parcial é o ato de fornecer alguns argumentos agora e o restante depois. Funções com curry tornam a aplicação parcial natural.

object Main {
  def greet(greeting: String)(name: String): String = s"$greeting, $name!"
  def main(args: Array[String]): Unit = {
    val sayHi = greet("Hi") _
    println(sayHi("Ann"))
    println(sayHi("Bob"))
  }
}

Verificação rápida

Como se define um método com curry no Scala?

Recapitulação

Você aprendeu sobre curry e aplicação parcial:

  • Métodos com curry usam várias listas de parâmetros: f(a)(b)
  • Aplique parcialmente com f(x) _ para obter uma nova função
  • .curried e Function.uncurried convertem entre as formas
  • Isso ajuda na reutilização, na especialização e na inferência de tipos

Perguntas Frequentes

A aula “Currying” é grátis?

Sim — o texto completo de “Currying” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Scala for Backend Engineering & Functional Programming, atualize para CoddyKit PRO. O curso de Scala for Backend Engineering & Functional Programming inclui 4 aulas no total.

O que vou aprender em “Currying”?

Aplicação parcial. Você pratica Scala for Backend Engineering & Functional Programming com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Scala for Backend Engineering & Functional Programming?

Nenhuma experiência prévia é necessária. Scala for Backend Engineering & Functional Programming no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.

Quanto tempo leva a aula “Currying”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Scala for Backend Engineering & Functional Programming?

Sim. Cada aula de Scala for Backend Engineering & Functional Programming inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções como valores
  2. Currying
  3. Composição
  4. Closures
← Voltar para Scala for Backend Engineering & Functional Programming