【问题标题】:Possible ways for currying case class constructor in scala在scala中柯里化案例类构造函数的可能方法
【发布时间】:2017-09-01 00:29:02
【问题描述】:

参考下面的链接 Scala: curried constructors

 class Person(var name : String, var age : Int, var email : String)
  def mkPerson = (n : String) => (a : Int) => (e : String) => new Person(n,a,e)
  def makeName(s:String):String="Hello"+s
  def makeAge(age:Int):Int=age
  def makeEmail(email:String):String=email

  val s=mkPerson(makeName("abcd"))
  val t1=s(makeAge(2))
  val t2=t1(makeEmail("abc@gmail.com"))

我创建了方法makeName,makeAge,makeEmail 来丰富这些值。实际用例不同

问题

  • 有没有办法通过案例类实现上述目标
  • 我不想使用变量s,t1,t2
  • 我们能否通过部分应用函数来实现上述目标

【问题讨论】:

  • 因此,一旦创建了 val p: Person,您是否希望 p.name 包含 Hello 前缀(即您是否要“忘记”原始值并使用“丰富”值只)?
  • 是的,我想要丰富,我想要案例类的解决方案。实际上,我有丰富的东西,它们将返回值,我想构建我在代码中显示的方式。使用部分应用函数的任何其他可能方式
  • 你想要在这里实现的目标对我来说仍然不清楚:你是否希望“自动”丰富对 Person("a", 1, "b") 的调用(即必然会导致 Person(Helloa, 1, b)?如果不是,你想要一个单独的mkPerson(String, Int, String): Person 创造了“丰富”的人?最佳用法会是什么样子?
  • mkPerson(String, Int, String): Person 方法

标签: scala case-class


【解决方案1】:

如果您对带有 3 个参数的 mkPerson 表示满意,则不确定在这种情况下 curried 函数是否必要/有用:

case class Person private(name: String, age: Int, email: String)

def makeName(s: String): String = "Hello" + s
def makeAge(age: Int): Int = age
def makeEmail(email: String): String = email

def mkPerson(name: String, age: Int, email: String): Person =
  Person(makeName(name), makeAge(age), makeEmail(email))

println(Person("Jane", 29, "jane@mail.com"))   // no enrichment: Person(Jane,29,jane@mail.com)
println(mkPerson("Jane", 29, "jane@mail.com")) // enriched: Person(HelloJane,29,jane@mail.com)

那么,如果你真的需要,可以咖喱mkPerson

val curried = (mkPerson _).curried
curried("Jane")(29)("jane@mail.com")  // same enriched result

【讨论】:

  • thks makePerson 可以有很多参数,我们在这里使用部分应用函数
  • 首先 - 是的,显示在最后。更重要的是 - 为什么?部分应用函数很有用,例如,当您想在一次调用中传递一些参数,而在单独的调用中传递一些参数时;或者,当您想要多次重复使用应用某些参数的结果时,同时为其余参数提供不同的值;如果这是您的用例,请在问题中显示。
  • 好的。不确定,但我想将值从一个案例类映射到另一个。即。模型 A 中的字段 x 映射到模型 B 中的字段 y。所以我正在为每个映射编写一个转换器,并希望随着字段的映射逐渐构造模型 B 的对象
  • 我明白了。考虑发布一个显示所有这些的新问题,这样您可能会得到更好的答案...
猜你喜欢
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-20
  • 1970-01-01
  • 2011-01-24
相关资源
最近更新 更多