Mil*_*bin 16 types functional-programming scala higher-kinded-types
在Scala中,我们可以为低级类型定义类型级别的标识函数,如下所示,
type Id[A] = A
Run Code Online (Sandbox Code Playgroud)
我们还可以为更高级别的类型定义类似的东西吗?IE浏览器.我们可以填写空白,
type HKId[A[...]] = ...
Run Code Online (Sandbox Code Playgroud)
所以类似于HKId [List]的东西让我们回到List类型构造函数?
在诸如此类的东西中绑定自由名称
type Foo[X] = List[X]
val l : Foo[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
可能会让我们期待一个更高级的类型级别的身份看起来像,
type HKId[A[X]] = A[X]
Run Code Online (Sandbox Code Playgroud)
但scalac抱怨在RHS上找不到X型.
是否有一些聪明的编码可以解决这个问题?或者现在是不可能的?
ret*_*nym 13
X
in type HKId[A[X]] = ...
是一个更高阶的类型参数.它的作用域是type参数子句,通常在类型约束中引用.见规范§4.4:
上面的范围限制一般化为嵌套类型参数子句的情况,它声明了高阶类型参数.高阶类型参数(类型参数t的类型参数)仅在其紧邻的参数子句中可见(可能包括更深嵌套级别的子句)和t的边界.因此,它们的名称只能与其他可见参数的名称成对地不同.由于高阶类型参数的名称因此通常是不相关的,因此它们可以用"_"表示,这是无处可见的.
前段时间,我们讨论了为类型函数添加文字语法的可能性,例如[A] Either[Int, A]
.这在Scalaz中非常有用.与此同时,我们使用了Alexey的回答中的技巧,用PartialApplyXofY特征表达.推理会更好,但这更棘手,尽管在Trac中无害的进入!)
无论如何,在那个帖子中,Adriaan提到:
显然,实现逻辑上遵循匿名类型函数的所有内容显然不是一件容易的事,因为我们目前没有必要的基础结构来允许人们编写更高级别的类型别名,例如:
类型MyTypeFun = [X,Y]对[Y,X] //可取,但很难支持当前的实现(我们查看符号的类型参数来推断它的类型)
UPDATE
事实证明你已经非常接近了:
def hk[_[_]] = ();
hk[({type A[X] = X})#A]
Run Code Online (Sandbox Code Playgroud)
或者获得一点创意:
def hk[_[_]] = (); hk[({type \[X] = X}) # \ ]
def hk[_[_]] = (); hk[({type ?[?]=?})#? ]
Run Code Online (Sandbox Code Playgroud)
无法找到一种方法来做它type
,但这有效:
class HKId[A[_]] {
type Value[X] = A[X]
}
Run Code Online (Sandbox Code Playgroud)
这编译:
scala> List(1): HKId[List]#Value[Int]
res2: List[Int] = List(1)
Run Code Online (Sandbox Code Playgroud)
而这不是:
scala> List(1): HKId[List]#Value[Boolean]
<console>:7: error: type mismatch;
found : Int(1)
required: Boolean
List(1): HKId[List]#Value[Boolean]
Run Code Online (Sandbox Code Playgroud)
从@retronym那里抢走正确答案似乎有点不公平,但看起来我们可以更接近我所追求的解决方案,
\n\nscala> type HKId[A[_]] = { type \xce\xbb[X] = A[X] }\ndefined type alias HKId\n\nscala> def foo[C[_]] : C[Int] = null.asInstanceOf\nfoo: [C[_]]=> C[Int]\n\nscala> foo[List]\nres0: List[Int] = null\n\nscala> foo[HKId[List]#\xce\xbb]\nres1: List[Int] = null\n
Run Code Online (Sandbox Code Playgroud)\n\n我不知道为什么这现在看起来很明显,但一年前并不明显……也许是因为从那时起我们都更习惯于看到类型 lambda。
\n 归档时间: |
|
查看次数: |
1372 次 |
最近记录: |