2

私はScalaを学ぼうとしていて、初心者です。私はこれが最適な関数型コードではないことを知っており、誰もが私に与えることができるアドバイスを歓迎しますが、なぜ私がこの関数に忠実であり続けるのかを理解したいと思います。

  def balance(chars: List[Char]): Boolean = {
    val newList = chars.filter(x => x.equals('(') || x.equals(')'));
    return countParams(newList, 0)
  }                                               

  def countParams(xs: List[Char], y: Int): Boolean = {
    println(y + " right Here")
    if (y < 0) {
      println(y + " Here")
      return false
    } else {
      println(y + " Greater than 0")
      if (xs.size > 0) {
        println(xs.size + " this is the size")
        xs match {
          case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1)
          case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1)
          case xs => 0
        }
      }
    }
    return true;
  }
  balance("()())))".toList)

ifステートメントのfalseブランチにヒットしていることはわかっていますが、関数の最後でtrueを返します。私が理解するのを手伝ってください。ありがとう。

4

2 に答える 2

3

返す内容をより明確にするか、コンパイラーに対してより明確にする必要があります。これは機能します:

def countParams(xs: List[Char], y: Int): Boolean = {
    println(y + " right Here")
    if (y < 0) {
      println(y + " Here")
      false
    } else {
      println(y + " Greater than 0")
      if (xs.size > 0) {
        println(xs.size + " this is the size")
        xs match {
          case xs if (xs.head.equals('(')) => countParams(xs.tail, y + 1)
          case xs if (xs.head.equals(')')) => countParams(xs.tail, y - 1)
          case xs => false
        }
      } else {
        true
      }
    }
}

上記のコードでは、の各ブランチifが何らかの値を返すため、コンパイラはそれが返される値であると想定します。ところで、ロギングなしで、はるかに慣用的なバージョン:

def countParams(xs: List[Char], y: Int) =
    xs match {
        case Nil => y == 0
        case '(' :: rest => countParams(rest, y + 1)
        case ')' :: rest if(y > 0) => countParams(rest, y - 1)
        case _ => false  //must be closing parens but y < 0
    }
于 2012-09-28T21:36:20.827 に答える
2

inscalaifは表現です。これは値を返し、他の言語の場合は概念的に3値に似ています。

elseブランチで何かを返したい場合は、ネストされたifにelseを設定し、それが値を返すことを許可する必要があります。

つまり、countParamsはそのすべてのコードを評価し、{}countParamsに割り当てられているブロック()の最後の行に分類されます。つまり、true;

つまり、countParamsの最後でtrueを失い、意味のあるものを返すelseの場合はネストされたものを指定します。

于 2012-09-28T21:36:00.663 に答える