Scala 有人能给我解释一下这个不成形的图书馆是干什么用的吗?

Scala 有人能给我解释一下这个不成形的图书馆是干什么用的吗?,scala,shapeless,Scala,Shapeless,有人能简单地向我解释一下这个不成形的图书馆是干什么用的吗 Scala有泛型和继承功能,所以我有点搞不清Shapess的用途 也许用一个用例来澄清事情会有帮助。这有点难以解释,因为shapeless有很多特性;我可能会发现更容易“用简单的术语解释变量的用途”。你肯定想从这个开始 广义地说,Shapess是关于使用类型编程的。在编译时执行通常在运行时执行的操作,精确跟踪列表中每个元素的类型,能够从元组到hlist转换为case类,创建多态函数(与方法相反),等等 典型的使用场景如下所示: 从某处将

有人能简单地向我解释一下这个不成形的图书馆是干什么用的吗

Scala有泛型和继承功能,所以我有点搞不清Shapess的用途


也许用一个用例来澄清事情会有帮助。

这有点难以解释,因为shapeless有很多特性;我可能会发现更容易“用简单的术语解释变量的用途”。你肯定想从这个开始

广义地说,Shapess是关于使用类型编程的。在编译时执行通常在运行时执行的操作,精确跟踪列表中每个元素的类型,能够从元组到hlist转换为case类,创建多态函数(与方法相反),等等

典型的使用场景如下所示:

  • 从某处将一组值读入
    列表
  • 将该
    列表
    执行类型安全转换为
    HList
  • 使用一个多态函数映射该
    HList
    ,例如,使值正常化
  • 将第三个元素(静态称为
    Int
    )转换为0填充字符串
  • 使用HList中的值构造一个case类
作为参考,an将有一个精确的类型,例如
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会有更难的时间来推断推断事物或者尝试编译你的代码,即使这对你来说可能不是问题。