在 Scala 3 中,我可以使用 lambda 型別為狀態定義一個仿函式:
given stateFunctor[S]: Functor[[A] =>> State[S, A]] with
override def map[A, B](a: State[S, A])(fx: A => B): State[S, B] = State(a.run.andThen { case (s, a) => (s, fx(a)) })
我希望它可以使用?或_通配符:
given stateFunctor[S]: Functor[State[S, ?]] with
override def map[A, B](a: State[S, A])(fx: A => B): State[S, B] = State(a.run.andThen { case (s, a) => (s, fx(a)) })
但我收到以下編譯錯誤:
輸入引數 domain.State[S, ? <: AnyKind] 與給定 stateFunctor[S] 的系結 [_$1] 不具有相同的種類: Functor[State[S, ? <:AnyKind]] 與
為什么它不起作用?我錯過了什么?我認為 Scala 3 支持型別通配符的 kind-projector 語法。
斯卡拉版本:3.1.3
如果你需要它,這里是State和Functor定義:
case class State[S, A](run:S => (S, A)):
def exec(s:S):S = run(s)._1
def eval(s:S):A = run(s)._2
trait Functor[F[_]]:
def map[A, B](a: F[A])(fx: A => B): F[B]
uj5u.com熱心網友回復:
?是錯的。?適用于存在型別State[S, ?](在 Scala 2 中它是State[S, _]aka State[S, A] forSome { type A }),不適用于 lambda 型別。
_適用于 lambda 型別(在 Scala 2 中它們被模擬({ type F[A] = State[S, A] })#F)。應該是這樣,State[S, _]但這還沒有實作。
https://docs.scala-lang.org/scala3/reference/changed-features/wildcards.html
型別中通配符引數的語法已從更改
_為?
我們希望使用下劃線語法
_來表示匿名型別引數,使其與值引數串列中的含義保持一致。因此,就像f(_)lambda 的簡寫一樣x => f(x),未來C[_]將成為 lambda 型別的簡寫[X] =>> C[X]。
到目前為止,您可以撰寫[A] =>> State[S, A]或使用kind 投影儀 State[S, *]
scalaVersion := "3.2.1"
scalacOptions = "-Ykind-projector"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/524390.html
