Scala 3中部分应用的类型构造函数?

iyfjxgzm  于 2023-02-16  发布在  Scala
关注(0)|答案(1)|浏览(154)

阅读"为了伟大的利益而学习Haskell",并试图理解这本书中的Haskell概念可能是如何在Scala 3中编写的。
第11章在关于函数作为函式的部分提到了"部分应用的类型构造函数":
另一个我们一直在讨论但不知道是函数的例子是(-〉)r.你现在可能有点困惑了,因为(-〉)r表示?函数类型r-〉a可以重写为(-〉)r a,就像我们可以把2 + 3写成(+)2 3.当我们把它看作(-〉)r a,我们可以看到(-〉),因为我们看到它只是一个类型构造函数它有两个类型参数,就像Either一样,但是记住,我们说过类型构造函数必须只带一个类型参数才能成为Functor的示例。这就是为什么我们不能(-〉)一个Functor的示例,但是如果我们将其部分应用于(-〉)R**,它不会造成任何问题。如果语法允许类型构造函数部分地应用于节(就像我们可以通过执行(2+)来部分应用+,这与(+)2相同),您可以将(-〉)r写成(r-〉)

instance Functor ((->) r) where  
    fmap f g = (\x -> f (g x))

我理解书中的所有这些逻辑+Haskell处理类型构造函数就像处理通常的函数一样的事实-那些可以被curry和部分应用。

    • 问题:**

Scala 3类似于这种部分应用的类型构造函数,因此我们可以用类似于下面Haskell定义的方式定义fmap
(it smth是否可以用更高级的类型来建模?)

p5cysglq

p5cysglq1#

在Scala 3中,您可以使用type lambdas

trait Functor[F[_]]:
  def map[A, B](f: A => B)(fa: F[A]): F[B]
given [R]: Functor[[X] =>> R => X] with
  override def map[A, B](f: A => B)(fa: R => A): R => B = fa andThen f

kind projectorscalacOptions += "-Ykind-projector"

given [R]: Functor[R => *] with
  override def map[A, B](f: A => B)(fa: R => A): R => B = fa andThen f

最终这应该成为

given [R]: Functor[R => _] with
  override def map[A, B](f: A => B)(fa: R => A): R => B = fa andThen f

Polymorphic method works with type lambda, but not with type wildcard in Scala 3

相关问题