首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Scala中,有没有减少泛型类型多重性的简写?

在Scala中,有没有减少泛型类型多重性的简写?
EN

Stack Overflow用户
提问于 2011-10-04 13:00:50
回答 3查看 790关注 0票数 11

我想调用Scalaz的pure方法将一个值放入State monad中。以下是工作原理:

代码语言:javascript
运行
复制
type IntState[A] = State[Int, A]
val a = "a".pure[IntState]
a(1)
    (Int, java.lang.String) = (1,a)

我还可以消除类型别名(感谢Scalaz的Pure.scala):

代码语言:javascript
运行
复制
val a = "a".pure[({type T[A]=State[Int,A]})#T]
a(1)
    (Int, java.lang.String) = (1,a)

但这是非常笨拙的。有没有一种更短的方法来合成这样的类型?就像函数字面量的占位符语法一样,是否有类似的内容:

代码语言:javascript
运行
复制
"a".pure[State[Int, *]]
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-04 22:29:46

对于Scala中简明的分部类型应用程序( as 2),您可以按如下方式插入类型表示法。

代码语言:javascript
运行
复制
type ![F[_, _], X] = TF { type ![Y] = F[X,  Y] }

"a".pure[(State!Int)# !]

请注意,我们可以为两种类型的构造函数(或类型别名)插入符号。

票数 6
EN

Stack Overflow用户

发布于 2011-10-04 13:52:16

不确定这是不是更好,但这是@kmizu前几天在推特上写的一种方法:

代码语言:javascript
运行
复制
scala> trait TF {
     |   type Apply[A]
     | }
defined trait TF

scala> type Curried2[F[_, _]] = TF {
     |   type Apply[X] = TF {
     |     type Apply[Y] = F[X, Y]
     |   }
     | }
defined type alias Curried2

scala> "a".pure[Curried2[State]#Apply[Int]#Apply]
res7: scalaz.State[Int,java.lang.String] = scalaz.States$$anon$1@1dc1d18

您可以通过使用符号类型别名使它看起来更好一些。

代码语言:javascript
运行
复制
scala> type ![F[_, _]] = TF {
     |   type ![X] = TF {
     |     type ![Y] = F[X, Y]
     |   }
     | }
defined type alias $bang

scala> "a".pure[![State]# ![Int]# !]
res9: scalaz.State[Int,java.lang.String] = scalaz.States$$anon$1@1740235
票数 6
EN

Stack Overflow用户

发布于 2017-09-21 03:34:25

减少cats最流行的方法是kind-projector (https://github.com/non/kind-projector)插件,该插件也在cats库中使用。通过启用此插件,您的示例可以转换为:

代码语言:javascript
运行
复制
val a = "a".pure[State[Int, ?]]

注意:默认情况下,Dotty会启用此语法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7643493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档