[%]
타입추론되었으면 좋겠는 코틀린 코드
익명(211.114)
2023-04-03 12:44
추천 0
fun <T
, U
, V
, W
> lift3(
f
: (T
) -> (U
) -> (V
) -> W
): (List
<T
>) -> (List
<U
>) -> (List
<V
>) -> List
<W
> = { lt
->
{ lu
->
{ lv
->
lt
.map(f
).flatMap { lu
.map(it
) }.flatMap { lv
.map(it
) }
}
}
}
// 추론 불가
List
.lift3({ s1
->
{ s2
->
{ s3
->
s1
+ s2
+ s3
}
}
})(List("A", "B"))(List("1", "2"))(List("O", "X"))
.forEach(::println
)
// 제네릭 아규먼트 명시하여 동작하는 코드
List
.lift3
<String
, String
, String
, String
>({ s1
->
{ s2
->
{ s3
->
s1
+ s2
+ s3
}
}
})(List("A", "B"))(List("1", "2"))(List("O", "X"))
.forEach(::println
)
위에서 List.lift3의 제네릭 파라미터 타입 추론이 안됨
lift3({ ... ])까지만 있으면 안되는게 당연하지만 뒤에 List[String]들을 인자로 넣기 때문에 사람 눈으로는 TUVW가 모두 String임을 추론할 수 있지만
코틀린 컴파일러는 거기까지는 안해줌
근데 이런 코드를 어디서 써용
나는 코틀린을 다루는 기술 책 보면서 작성한건데 어차피 코드가 하는 일은 여기서 안중요한듯
실용성은 없고 억까할라고 만든거란거지?
논리 점프 보소 딱 봐도 어떤 타입인지 눈에 보일거를 생략할수 있게 해달라는게 억까라니 사실 이 부분 타입 추론 안되서 아쉽다는것도 그냥 이 책에도 써있는거임
lift3이 왜 실용성이 없냐 ;;
그니까 너는 { a: Int -> a }(10) 을 { it }(10) 으로 추론 할 수 있어야하지 않냐 이말이지?
딱 봐도 문제 존나생길 수 있을 것 같은 표현식인데 점심 먹으면서 생각 좀 해봄
근데 이거와 별개로 (T) -> Unit 람다에 () -> Unit 을 못넣는거에 관해 이슈 올라온게 있는데 그거랑도 연관잊있을듯
https://youtrack.jetbrains.com/issue/KT-57165