在 scala 中创建类型文字,例如。 Aplha数字字符串

Creating Type Literals in scala eg. AplhaNumericString

目前我有一堆函数可以检查字符串是否满足特定条件,例如 isValidAlphaNumericString 或 isValidUserName。它使用我自己的隐式 stringOps class。特别是在处理作者姓名等复杂需求时非常有用。要求字符串只能有连续的-_。或 space 个字符等。使用复杂的正则表达式。但为什么要停在那里呢?该字符串未被正确约束,这意味着某些函数可以将匿名函数映射到它并在您检查它后破坏该变量。这不是一种非常安全的方法。我想要为每个绑定到特征 ConstrainedString 的约束字符串创建类型,这允许我指定每种类型如何处理方法。

我正在为它的设计方面苦苦挣扎。基本上有两件事我需要帮助。

当函数打破约束时会发生什么?有没有办法在编译时捕捉到这个?我是否限制我的类型只使用我 知道 不会打破约束的方法,即。连接 2 个 AlphaNumericString 将始终 return 字母数字字符串?或者我是否将实际类型设置为 Option[String],所以如果合同被破坏,该值将变为 None?除了到处抛出异常之外,一定有更好的方法。

我认为实现此目的的最佳方法是通过类似于此示例的 StringLike 类型class 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"

我认为适当的方法是通过指向 Bar apply() 方法来提供字符串到 Bar 的隐式转换,该方法检查该方法是否是有效的 Bar。梦想是像 Numbers 在 scala 中那样工作,并且编译失败。

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

如果有人实际实现了类似的东西,我喜欢看看其他代码:

有没有一种简单的方法来保持约束而不考虑功能问题

我关于如何处理这个问题的理论是否正确?

假设您是一个 scala 编译器 :) 如何在不实际评估右侧和转换的情况下处理像 val foo: AlphaNumericString = someString() 这样的赋值失败的任务功能?

这只是我的长篇大论,你所要求的显然是不可能的。

它似乎很适合 Scala 宏。有关详细信息,请参阅 this post。您可以拥有自己的字符串类型并对其执行编译时验证。