【问题标题】:Can all usages of `forSome` be replaced by an equivalent usage of `_`?`forSome` 的所有用法都可以用 `_` 的等效用法代替吗?
【发布时间】:2012-03-15 19:56:35
【问题描述】:

例如,List[T] forSome { type T } 等价于List[_],但对于forSome 的所有可能用法是否都是如此,或者在某些情况下forSome 不能被第二个语法的等价物替换?

【问题讨论】:

    标签: generics scala types existential-type


    【解决方案1】:

    不,不是所有的用法都可以这样转换。像这样的东西(感谢下面的 retronym,谁应该得到这个投票的支持)

    def foo(xs: Map[T, T] forSome { type T})
    

    这里的重点是我可以在多个地方使用存在主义,但它是同一个存在主义。显然,如果您使用通配符,您将指代不同的存在

    【讨论】:

    • 在这个例子中;不。老实说,我不是 100% 确定它是有效的语法,也没有机会检查。但我见过类似的例子
    • 确实,我只是用 scala 2.9.1 试了一下,它不能编译!能否请您修复它,我无法为您解决,我从未使用/需要 forSome 构造。
    • 按照retronym建议的路线修复
    【解决方案2】:

    _ 在此上下文中是“现有类型的占位符语法”,在language specification 的 3.2.10 中进行了描述。

    这个名字听起来很像_ 的另一种用法,“匿名函数的占位符语法”。此速记不能用于所有功能。例如:

    (a: A) => f(g(a))
    f(g(_: A)) // WRONG, this means f((a: A) => g(a))
    

    我们可以为existentials构造一个类似的例子,无法表示_

    F[G[A]] forSome { type A }
    F[G[_]] // WRONG, this means F[G[A] forSome { type A }]
    

    旁注:存在式不是价值级别函数的类型级别模拟。那将是:

    ({type l[A] = F[G[A]])#l
    

    事实上,遗憾的是 Scala 使用下划线表示存在,而不是类型级别的函数。

    更新

    让我用同样的方式框定@oxbow_lakes'的答案:

    (a: A) => h(a, a)
    h(_, _) // WRONG, this means (a, b) => f(a, b)
    
    H[A, A] forSome { type A }
    H[_, _] // WRONG, this means H[A, B] forSome { type A; type B }
    

    【讨论】:

    • F[G[A]] forSome { type A } 和 F[G[A] forSome { type A }] 有什么区别?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2018-10-06
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多