类型参数中*(星号)和_(下划线)之间的差异

ibanezn04

这里有人说星号是scala 3的下划线,但是我在scala 2.13中看到了一些类似的代码:

def make[F[_]: ContextShift: MonadError[*[_], Throwable]: Effect: Logging](): ...

它是否具有相同的含义,仅在*中指定类型与_中的类型不同?

马特乌斯·库布佐克(Mateusz Kubuszok)

_ 表示(取决于上下文)

  • 类型构造函数-如果在类型参数定义/约束中使用
    def foo[F[_]]: Unit
    
  • 存在类型-如果应用于应该用作适当类型的东西
    def bar(f: F[_]): F[_]
    

在这里我们想了解类型构造器。

类型构造函数将(简化)F某种尚未定义的东西,但我们可以将A应用于并将其设为F[A]例如

  • List可以通过,F[_]因为它有空隙,如果我们用它填充,例如,String它可以变成List[String]
  • Option也可以通过F[_],它有一个空白,如果我们用Int填充,它将变成Option[Int]
  • Double不能用作F[_],因为它没有间隙

具有“空白”的类型通常表示为* -> *,而没有“ gap”的类型通常表示*我们可以*简单地将其理解为类型,而可以理解* -> *为“需要另一个类型构成类型的类型”或类型构造函数。

(像上面提到的那种类型更高级的类型本身就是复杂的事情,因此,您最好在该问题之外进一步了解它们)。

*(来自kindprojector插件)用于同类投影-语法是从上面的符号启发而来的,它显示了如果我们要创建新类型,将在哪里传递类型:

Monad[F[List[*]]]

真的像:

type UsefulAlias[A] = F[List[A]]
Monad[UsefulAlias]

除了它在没有类型别名的情况下工作之外。

如果是Dotty,最好用lambda类型表示

// Monad[F[List[*]]] is equal to
[A] =>> Monad[List[A]]

在您的示例中:

def make[F[_]: ContextShift: MonadError[*[_], Throwable]: Effect: Logging](): ...
  • F[_]被定义为类的构造函数-这样你就可以不通过有StringIntByte,但你可以通过那里ListFuture或者Option(因为他们把一个类型参数)
  • F[_]: ContextShift是-的快捷方式[F[_]](implicit sth: ContextShift[F])-我们可以看到ContextShift将某种类型的参数作为参数作为参数(例如F[_]
  • [F[_]: MonadError[*[_], Throwable] 可以扩展为:
    type Helper[G[_]] = MonadError[G, Throwable]
    [F[_]: Helper]
    
    反过来可以改写为
    type Helper[G[_]] = MonadError[G, Throwable]
    [F[_]](implicit me: Helper[F])
    
    或使用lambda类型
    [F[_]] =>> MonadError[F, Throwable]
    

如果将其编写为:

def make[F[_]: ContextShift: MonadError[*, Throwable]: Effect: Logging]():

问题是,这*表明预期类型为

[A] =>> MonadError[A, Throwable]

同时*应该* -> *代替*因此,这*[_]意味着“我们要在此处通过用一个东西代替*参数来创建一个新的类型构造函数,但是我们要表示该参数是实物* -> *而不是实物*

[F[_]] =>> MonadError[F, Throwable]

因此,我们将添加[_]以向编译器显示它是类型构造函数。

需要吸收很多东西,应该更容易些,我只能感到抱歉,并说在Dotty中会更清楚。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

文字和下划线之间的间距

来自分类Dev

这些scala方法中下划线用法之间的差异

来自分类Dev

高阶类型参数中下划线用法的规则

来自分类Dev

删除链接和文本之间的空格和下划线

来自分类Dev

飞镖和下划线

来自分类Dev

飞镖和下划线

来自分类Dev

带有星号*和下划线_的Markdown强调正则表达式_

来自分类Dev

NodeJS中的双下划线与单下划线

来自分类Dev

CSS多行链接,可调整下划线的厚度以及字母和下划线之间的垂直间距

来自分类Dev

下划线,查找和更改对象中的值

来自分类Dev

用下划线交换字典中的键和值

来自分类Dev

Struts 2中的下划线和通配符操作映射

来自分类Dev

下划线,查找和更改对象中的值

来自分类Dev

从工具提示中删除下划线和链接

来自分类Dev

使用 Spring 和 MSSQL 的表名中的下划线

来自分类Dev

使用encodeURIComponent编码括号下划线倾斜星号

来自分类Dev

漂亮的保持用下划线替换星号字符

来自分类Dev

在数字之间加下划线

来自分类Dev

奇怪的语法-数字之间的下划线

来自分类Dev

如何检测下划线(“ _”)之间的数字?

来自分类Dev

下划线与参数反跳

来自分类Dev

下划线用作宏函数的参数

来自分类Dev

带参数的下划线去抖动

来自分类Dev

Perl qq和下划线

来自分类Dev

下划线isEqual和JSON

来自分类Dev

CSS下划线和字母间距

来自分类Dev

下划线的findWhere和MongoDB对象

来自分类Dev

CSS下划线和字母间距

来自分类Dev

下划线和左函数