Scala 有人能给我解释一下这个不成形的图书馆是干什么用的吗?
有人能简单地向我解释一下这个不成形的图书馆是干什么用的吗 Scala有泛型和继承功能,所以我有点搞不清Shapess的用途Scala 有人能给我解释一下这个不成形的图书馆是干什么用的吗?,scala,shapeless,Scala,Shapeless,有人能简单地向我解释一下这个不成形的图书馆是干什么用的吗 Scala有泛型和继承功能,所以我有点搞不清Shapess的用途 也许用一个用例来澄清事情会有帮助。这有点难以解释,因为shapeless有很多特性;我可能会发现更容易“用简单的术语解释变量的用途”。你肯定想从这个开始 广义地说,Shapess是关于使用类型编程的。在编译时执行通常在运行时执行的操作,精确跟踪列表中每个元素的类型,能够从元组到hlist转换为case类,创建多态函数(与方法相反),等等 典型的使用场景如下所示: 从某处将
也许用一个用例来澄清事情会有帮助。这有点难以解释,因为shapeless有很多特性;我可能会发现更容易“用简单的术语解释变量的用途”。你肯定想从这个开始 广义地说,Shapess是关于使用类型编程的。在编译时执行通常在运行时执行的操作,精确跟踪列表中每个元素的类型,能够从元组到hlist转换为case类,创建多态函数(与方法相反),等等 典型的使用场景如下所示:
- 从某处将一组值读入
列表
- 将该
执行类型安全转换为列表
HList
- 使用一个多态函数映射该
,例如,使值正常化HList
- 将第三个元素(静态称为
)转换为0填充字符串Int
- 使用HList中的值构造一个case类
Int::String::Boolean::HNil
(是的,这实际上是一个单一的类型),其中所有内容都是固定的,大小是固定的。因此,您要么需要在编译时准确地知道将进入HList的内容,要么需要类型安全转换
如果您使用这样一个HList的尾部
,您将得到一个字符串::布尔::HNil
,并且编译时保证它的头部将是一个字符串
。在head前面加上一个值同样会保留所有涉及的类型
Shapeless还随类型类一起提供,允许您对元组和case类使用HList操作
我倾向于使用的其他功能包括:
- ,它允许您静态键入一个值,例如“a
,String
或Double
,但不允许键入其他值”(非常类似于Int
或
,但不限于两种可能性)
- ,这简化了使用嵌套案例类的工作
HList
可能会让人感到困惑,除非您尝试使用类型并委托或打开类型。请看以下内容:
val myList = 1 :: 2 :: "3" :: fred :: Nil
这里的myList
的类型是什么?如果你要检查它,你会看到它的类型是List[Any]
。那不是很有帮助。如果我尝试使用下面的PartialFunction[Any]
将其映射到map
,则更没有帮助:
myList.map{
case x: Int => x
case x: String => Int.parseInt(x)
}
在运行时,这可能会抛出一个MatchError
,因为我实际上还没有告诉您fred
是什么类型。它的类型可能是Fred
使用HList
可以在编译时知道是否未能捕获该列表的某个类型。在上面,如果我在访问第三个元素时定义了myList=1::2::“3”::fred::HNil
,它的类型将是String
,这在编译时是已知的
正如@KevinWright所说的,它不仅仅是不成形的,但是
HList
是库的定义特性之一 无形状的一切都有两个共同点:
首先,它不在Scala标准库中,但可以说应该在Scala标准库中。因此,询问Shapeless的用途有点像询问Scala标准库的用途!这是为了一切。这是一个手提包 (但这不是一个完全随意的抓包,因为:) 其次,Shapeless中的所有内容都在编译时提供了增强的检查和安全性。在Shapeless中没有任何东西(我能想到?)在运行时真正“做”任何事情。所有有趣的操作都是在编译代码时发生的。我们的目标始终是增强信心,即如果您的代码能够编译,它将不会在运行时崩溃或做错误的事情。(因此有一句著名的俏皮话:)
关于类型级编程的内容有一个很好的介绍,并提供了更多参考资料的链接。“首先,它不在Scala标准库中,但可以说应该是。”如果发生这种情况,我会跑掉。。。然后尖叫。@JayZee你为什么这么说?让我试着比较一下……如果scala类型的安全是素食主义,那么Shapess就是素食主义!在我看来,它增加了一层额外的类型安全性,使scalac编译器已经很复杂的生命变得复杂。Shapeless需要更多的隐式和类型类。我不是scala编译方面的超级专家,但使用shapeless所付出的代价是,编译器在使用shapeless时会遇到困难(至少根据我的经验),而且速度会变慢。我更喜欢有一串“ISSITANSONS”,有时点击CLSASSCASTExchange和FIX,而不是依赖于无形状的魔法。考虑到即使你的IDE会有更难的时间来推断推断事物或者尝试编译你的代码,即使这对你来说可能不是问题。