developer tip

스칼라 식별 기능이 있습니까?

optionbox 2020. 11. 21. 14:13
반응형

스칼라 식별 기능이 있습니까?


내가 a List[Option[A]]같은 것을 가지고 있고 이것을로 변환하고 싶다면 List[A]표준 방법은 다음을 사용하는 것입니다 flatMap.

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatMap( o => o)
res0: List[java.lang.String] = List(Hello, World)

이제는 o => o단지 정체성 함수입니다. 할 수있는 방법이 있다고 생각했을 것입니다.

l.flatMap(Identity) //return a List[String]

그러나 .NET을 생성 할 수 없기 때문에이 작업을 수행 할 수 없습니다 object. 나는 소용이없는 몇 가지를 시도했다. 이런 일을 할 사람이 있습니까?


Predef 에는 식별 기능이 있습니다 .

l flatMap identity[Option[String]]

> List[String] = List(Hello, World)

for expresion이 더 좋습니다.

for(x <- l; y <- x) yield y

편집하다:

유형 매개 변수 (Option [String])가 필요한 이유를 파악하려고했습니다. 문제는 Option [T]에서 Iterable [T] 로의 유형 변환 인 것 같습니다.

식별 기능을 다음과 같이 정의하는 경우 :

l.flatMap( x => Option.option2Iterable(identity(x)))

유형 매개 변수는 생략 할 수 있습니다.


FWIW, Scala 2.8에서는 그냥 호출 flatten하면됩니다. Thomas 는 대부분 Scala 2.7에서 다루었습니다. 그는 그 신원을 사용하는 한 가지 대안을 놓쳤습니다.

l.flatMap[String](identity)

그러나 연산자 표기법에서는 작동하지 않습니다 (연산자 표기법은 유형 매개 변수를 허용하지 않는 것 같습니다. 이는 알아두면 좋습니다).

스칼라 2.7 ( 적어도에서)을 호출 수도 있지만 유형 없이는 아무것도 할 수 없습니다. 그러나 이것은 작동합니다.flattenList

l.flatten[String]

타입 추론 자에게 약간의 도움을 줄 수 있습니다.

scala> val l = List(Some("Hello"), None, Some("World"))
l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World))

scala> l.flatten[String]
res0: List[String] = List(Hello, World)

참고 URL : https://stackoverflow.com/questions/1797502/is-there-a-scala-identity-function

반응형