如何在匹配块内定义一个函数

时间:2016-08-12 08:14:12

标签: scala

问题

有没有办法在makeOrderedLeafList匹配块中定义insert函数?

问题

由于insert函数仅用于makeOrderedLeafList,我想在其中定义它。但是,如果放在底部,则需要出现错误"单位"。不能放在顶部作为" case"正在预料中。

def makeOrderedLeafList(freqs: List[(Char, Int)]): List[Leaf] = freqs match {
    case List() => List()
    case h :: t => insert(h, makeOrderedLeafList(t))
    case _      => throw new IllegalStateException
}

//--------------------------------------------------------------------------------
// Insert Leaf in the sorted list of Leaf.
//--------------------------------------------------------------------------------
def insert(c: (Char, Int), list: List[Leaf]): List[Leaf] = list match {
    case List() => List(new Leaf(c._1, c._2))
    case h :: t => {
        //--------------------------------------------------------------------------------
        // If C:[char, counter] is smaller, prepend it to the List[Leaf].
        // Otherwise, recurse call insert to find a position in the tail of the list.
        //--------------------------------------------------------------------------------
        if (c._2 <= h.weight) new Leaf(c._1, c._2) :: list
        else h :: insert(c, t)
    }
}

2 个答案:

答案 0 :(得分:3)

在调用之前将它放在盒子里面:

color = sns.color_palette("husl",3)[i] + (1.,)

case表达式的右侧可以是返回预期类型的​​任何代码块。代码块可以包含函数定义。

答案 1 :(得分:0)

如果在外部函数调用中定义了函数,它将在每次调用外部函数时创建一个新的内部函数实例。

val getInnerFuncHash = () => {
  val func = (x: Int) => x + 1
  func.hashCode().toString
}

println(getInnerFuncHash())
println(getInnerFuncHash())
println(getInnerFuncHash())

这将打印内部函数的hashCodes,并输出类似的内容,

1136974570
1030088901
2115208183

这意味着每次调用外部函数都会创建一个新的内部函数实例。

defs

的情况也是如此
def getInnerFuncHash(): String = {
  val func = (x: Int) => x + 1
  func.hashCode().toString()
}

println(getInnerFuncHash())
println(getInnerFuncHash())
println(getInnerFuncHash())