kir*_*uku 7 scala higher-kinded-types
符号类型class A[_]或def a[_](x: Any)具有无法在正文中引用的类型参数,因此我没有看到它在哪里有用以及它为什么编译.如果尝试引用此类型参数,则会引发错误:
scala> class A[_] { type X = _ }
<console>:1: error: unbound wildcard type
class A[_] { type X = _ }
^
scala> def a[_](x: Any) { type X = _ }
<console>:1: error: unbound wildcard type
def a[_](x: Any) { type X = _ }
^
Run Code Online (Sandbox Code Playgroud)
有人能告诉我这种类型在Scala中是否有用例?确切地说,我不是指类型参数中的存在类型或更高级的类型,只是那些[_]形成完整类型参数列表的litte .
因为我没有得到我期望的答案,所以我把它带到了scala-language。
\n\n我在这里粘贴了 Lars Hupel 的答案(因此,所有学分都适用于他),这主要解释了我想知道的内容:
\n\n\n\n我要在这里尝试一下。我认为在谈论类型成员时,该功能的使用变得很清楚。
\n\n假设您必须实现以下特征:
\n\nRun Code Online (Sandbox Code Playgroud)\n\ntrait Function {\n type Out[In]\n def apply[In](x: In): Out[In]\n}\n这将是一个(通用)函数,其中返回类型取决于输入类型。举个例子:
\n\nRun Code Online (Sandbox Code Playgroud)\n\nval someify = new Function {\n type Out[In] = Option[In] def\n apply[In](x: In) = Some(x)\n}\n\nsomeify(3) res0: Some[Int] = Some(3)\n到目前为止,一切都很好。现在,您将如何定义常量函数?
\n\nRun Code Online (Sandbox Code Playgroud)\n\nval const0 = new Function {\n type Out[In] = Int\n def apply[In](x: In) = 0\n}\n\nconst0(3) res1: const0.Out[Int] = 0\n(该类型
\n\nconst0.Out[Int]相当于Int,但不是以这种方式打印的。)请注意类型参数
\n\nIn实际上并未被使用。因此,您可以使用以下方法编写它_:Run Code Online (Sandbox Code Playgroud)\n\nval const0 = new Function {\n type Out[_] = Int\n def apply[In](x: In) = 0\n}\n在这种情况下,可以将
\n\n_其视为实际上无法引用的类型参数的名称。这是一个类型级别的函数,它不关心参数,就像值级别一样:Run Code Online (Sandbox Code Playgroud)\n\n(_: Int) => 3 res4: Int => Int = <function1>\n除了\xe2\x80\xa6
\n\nRun Code Online (Sandbox Code Playgroud)\n\ntype Foo[_, _] = Int\n<console>:7: error: _ is already defined as type _\n type Foo[_, _] = Int\n与以下内容进行比较:
\n\nRun Code Online (Sandbox Code Playgroud)\n\n(_: Int, _: String) => 3 res6: (Int, String) => Int = <function2>\n所以,总而言之:
\n\nRun Code Online (Sandbox Code Playgroud)\n\ntype F[_] = ConstType // when you have to implement a type member def\nfoo[_](...) // when you have to implement a generic method but don\'t\n // actually refer to the type parameter (occurs very rarely)\n您提到的主要内容
\n\nclass A[_]与此完全对称,只是没有真正的用例。考虑一下:
\n\nRun Code Online (Sandbox Code Playgroud)\n\ntrait FlyingDog[F[_]] { def swoosh[A, B](f: A => B, a: F[A]): F[B] }\n\n\n
FlyingDog现在假设您想为您的普通旧 .n实例创建一个实例class A。Run Code Online (Sandbox Code Playgroud)\n\nnew FlyingDog[A] { ... }\n// error: A takes no type parameters, expected: one\n// (aka \'kind mismatch\')\n有两种解决方案:
\n\n\n
\n\n- \n
改为声明
class A[_]。(不要这样做。)- \n
使用 lambda 类型:
\n\nRun Code Online (Sandbox Code Playgroud)new FlyingDog[({ type \xce\xbb[\xce\xb1] = A })#\xce\xbb]\n甚至
\n\nRun Code Online (Sandbox Code Playgroud)\nnew FlyingDog[({ type \xce\xbb[_] = A })#\xce\xbb]\n
| 归档时间: |
|
| 查看次数: |
2080 次 |
| 最近记录: |