Scala中如创建一个类型文字。 AplhaNumericString(Creating Typ

2019-10-21 13:17发布

目前,我有一堆的函数检查字符串符合一定的情况下,例如isValidAlphaNumericString或isValidUserName。 它使用我自己的隐stringOps类。 它是与复杂的要求,如作者姓名等需要字符串只有没有连续-_尤其是在处理时非常有用。 或空格字符等使用正则表达式复杂的。 但是,为什么要停止呢? 该字符串不正确的约束意味着一些功能可以匿名函数映射到它,并打破了变量,你已经检查后。 这不是一个很安全的进行方式。 我想为每个绑定到一个特质ConstrainedString,让我来指定如何与方法每种类型的交易,这些约束字符串创建类型。

我与它的设计方挣扎。 基本上有两件事情我需要帮助。

当一个函数打破约束,会发生什么? 有没有办法赶上这个在编译时? 我只从有,我知道不会打破约束,即限制方法,我喜欢的类型。 2级AlphaNumericString的级联总是返回字母数字字符串? 还是我的实际类型选项[字符串]所以如果合同被打破了值变为无? 必须有来自世界各地抛出异常预留一个更好的办法。

林假设实现这一目标的最佳途径是通过一个弦乐器的类型类相似,这个例子http://danielwestheide.com/blog/2013/02/06/the-neophytes-guide-to-scala-part-12-type-classes html的如

除了我希望能够写

val foo:Bar = "This is a valid Bar"

我相信适当的方式是提供串的隐式转换通过指向一个栏应用()方法,该方法检查是否该方法是有效的栏来巴。 梦想是有工作是相同的数字做Scala和具有该编译失败。

//fails to compile due to - not being a valid character
val foo:AlphaNumericString = "-Adlsa85464"

如果任何人实际上已经实施类似的东西ID爱的代码看,否则:

有一个简单的方法来保持约束,无论功能问题

是我对如何处理这个问题的正确的理论?

Answer 1:

这似乎是一个不错的选择斯卡拉宏。 请参阅这篇文章的详细信息。 你可以有你自己的字符串类型并对其进行编译时验证。



Answer 2:

试想一下,你是一个Scala编译器:) 会如何接近未能像一个分配的任务val foo: AlphaNumericString = someString()而无需实际评估的右侧和转换功能?

这只是我的长路说,这就是你所要求的显然是不可能的。



文章来源: Creating Type Literals in scala eg. AplhaNumericString