2017-12-08 8 views
2

저는 스칼라에 대해 매우 익숙하며 일부 로깅을 수행 한 후 일부 [문자열] 또는 없음을 반환하고 싶지만 리턴 된 유형이 폴드가 작동하지 않는 것으로 보입니다.Scala fold on 옵션 반환 유형

(Option[String]).fold{ 
      logger.info("Message append failed") 
      None 
      }{stuff=> 
      logger.info("Message appended") 
      Some(stuff) 
      } 

반환 컴파일러 오류가 내가 생각하는 다음 Expression of type Some[String] does not conform to expected type None.type

+0

'fold'및 re-wrapping을 통해 'Some (stuff)'을 래핑 해제하는 것은 다소 복잡한 것처럼 보입니다. 왜 그 상태를 확인하지 않는가? 'if (myOpt.nonEmpty) ... else ...' – jwvh

답변

1

, 당신은 잘못된 유형의 서명을 사용합니다. Option 인스턴스에서 fold 메소드를 호출해야합니다. 예를 들어 :

scala> val opt = Option("test") 
scala> opt.fold[Option[String]] { 
    | println("Message append failed.") 
    | None 
    | } { stuff => 
    | println("Message appended!") 
    | Some(stuff) 
    | } 
Message appended! 
res3: Option[String] = Some(test) 
+0

네, 작동하지 않습니다. 이상한 것이 올바른 유형을 선택하지 않았습니까? 문자열 옵션은 메서드에서 반환됩니다. –

+0

제 생각에는 컴파일러가 None에 혼란스러워합니다. 그래서 당신은 명시 적으로 ''fold ''타입 파라미터를 정의함으로써 그를 도왔습니다. – leshkin

+2

나는 보통 None 대신에 Option.empty를 타이프하여 그것을 풀어줍니다. – pedrorijo91

0

이 배의 정의를보고 교훈 : 당신이

Option("hi").fold(None)(x => Some(x)) 

유추 B 형 호출 할 때, 그래서

def fold[B](ifEmpty: => B)(f: A => B): B 

은 옵션 [아무것도]이 때문이다 컴파일러가 무엇을 알 수있는 방법이 없습니다 종류 아무 의미도 없습니다. 이 경우 Option.empty를 사용하고 형식을 지정하여 컴파일러를 도와 줄 수 있습니다.