복붙노트

[SCALA] 왜 스칼라는 재귀 함수의 반환 형식을 필요로 하는가?

SCALA

왜 스칼라는 재귀 함수의 반환 형식을 필요로 하는가?

코드 조각이 아래에 포함, 나는 네트워크 호출이 실패 할 경우 재 시도를 용이하게하기 위해 사용되는 재귀 함수 호출, (아마존 SimpleDB는 가끔 503을 반환하고 재 시도가 필요합니다.)이

내가 컴파일 할 때, 스칼라는 재귀 적 방법 simpledb_update 요구 유형을 결과를 뿌려줍니다.

// sends data to SimpleDB. Retries if necessary
def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) = {
 try {
  db(config("simpledb_db")) += (name, metadata)
 } catch {
  case e =>
   // if it fails, try again up to 5 times
  if(attempt < 6)
  {
   Thread.sleep(500)
   simpledb_update(name, metadata, attempt + 1)
   } else
     AUlog(name + ": SimpleDB Failed")
   }
 }

왜 이런 일이 재귀 함수에 필요합니까? 내 생각은 컴파일러 ... 다음 컴파일의 벌금을 만족하는 참 / 거짓 부울을 반환하는 것입니다.

// sends data to SimpleDB. Retries if necessary
 def simpledb_update(name: String, metadata: Map[String,String], attempt: Int): Boolean = {
 try {
  db(config("simpledb_db")) += (name, metadata)
  true
 } catch {
  case e =>
   // if it fails, try again up to 5 times
   if(attempt < 6)
   {
    Thread.sleep(500)
    simpledb_update(name, metadata, attempt + 1)
   } else
    AUlog(name + ": SimpleDB Failed")
    false
  }
}

해결법

  1. ==============================

    1.내가 알고있는 것처럼 형식 유추 알고리즘은 모든 재귀 함수에 대한 반환 형식을 결정하는 강력한 충분하지 않기 때문에, 재귀 함수는 반환 형식이 필요합니다.

    내가 알고있는 것처럼 형식 유추 알고리즘은 모든 재귀 함수에 대한 반환 형식을 결정하는 강력한 충분하지 않기 때문에, 재귀 함수는 반환 형식이 필요합니다.

    단위 : 그러나 반환 유형을 구성 할 필요가 없습니다, 당신은 단지 당신이 이미 사용하고 반환 형식을 선언해야합니다. 단위는 하나의 요소와 특별한 유형 (). 또한 스칼라에서 가장 "문"의 종류, 그리고 아무것도 돌려 줄 필요가없는 방법에 대한 선언에 반환 형식이지만, (당신이로) 그들의 부작용에 대해 실행됩니다. 당신도 당신 것 다른 형태로 장치를 반송로 방법을 선언 할 수 있습니다

    def simpledb_update(name: String, metadata: Map[String,String], attempt: Int):Unit = {
    

    더 많은 관용구 스칼라 유닛을 돌려주는 방법을위한 특별한 구문을 제공, 바로 반환 형식을두고는 등호

    def simpledb_update(name: String, metadata: Map[String,String], attempt: Int){
    

    스칼라 스타일 가이드에 따르면 당신은 등호를 사용하는 것을 선호한다

    http://docs.scala-lang.org/style/declarations.html

  2. ==============================

    2.그냥 당신이 반환 아무것도하지 않아도이 수단 라인에서 =를 제거하고이 장치를 반환합니다.

    그냥 당신이 반환 아무것도하지 않아도이 수단 라인에서 =를 제거하고이 장치를 반환합니다.

    def simpledb_update(name: String, metadata: Map[String,String], attempt: Int) {
    

    나는 필요가 반환 형식, 그것은 확실히 모든 재귀 경로가 올바른 유형을 만들 생각합니다. 일반 함수에서 유형이 모두 반환 지점에서 유추 될 것이다.

  3. from https://stackoverflow.com/questions/3739133/why-does-scala-require-a-return-type-for-recursive-functions by cc-by-sa and MIT license