This is my code
type MyFunc1[A] = Function1[_,A]
val toIntFunc : MyFunc1[Int] = (a : Double) => a.toInt
This compiles fine. But when I try out the code
toIntFunc(2.3d)
The compilation fails with the error
type mismatch, expected _$1, actual Double
Isn’t Function1[_,A]
telling that it is a function of anything (NOT Any) to A?
That _
is an existential type, which wasn’t your intent.
To partially apply a Scala 2 type like this, you need to use a type lambda. The syntax for that is awkward, so in practice, everyone uses https://github.com/typelevel/kind-projector.
In Scala 3, this will be part of the language.
1 Like
Thank you. Can I know what the awkward syntax is?
There are two ways to adjust types with aliases, one as you tried, one that’s more inline.
type FunkyFunc1[A] = Function1[String,A]
the inline way makes use of reflection and structural types
({ L[A] = Function1[String,A]})#L
Both of which are on the front-page of the kind-projector github page.
Only on style usage (side comment on _):
I was thinking more of eta postfix notate to raise a method to a function.
def foo = ???
val fooFn = foo _
To my eyes, it is too close to foo_. The wildcard is an issue too, but generally is easier My me to identify. I’m not very experienced, it might not be a big deal to other people.
The style guide:
https://docs.scala-lang.org/style/index.html
A brief introduction to _:
https://ananthakumaran.in/2010/03/29/scala-underscore-magic.html
IIRC, that the underscore for eta expansion is mostly (entirely?) going away in Scala 3.
1 Like