【问题标题】:Conditional Implicit functions in ScalaScala 中的条件隐式函数
【发布时间】:2016-04-14 00:00:31
【问题描述】:

我正在尝试在 Scala 中设计 DSL。为此,我想在精确字符串上创建一个隐式函数。 我知道要为任何字符串创建一个隐式函数,我可以这样写:

class StringPlus(str: String) {
    def some_function(): Unit = do_something
}
implicit def string2StringPlus(str: String) = new StringPlus(str)

但我不知道如何修改它以仅为某些字符串创建此隐式函数。是否可以为隐式函数提供布尔条件,以便仅在布尔条件为真时创建隐式函数(例如,如果字符串的长度为 5 或更长,如果字符串的第一个字母是字母“a”等)而不是所有字符串?

【问题讨论】:

  • 您的字符串是编译时的常量(例如magicMethod "this-is-always-foo")还是依赖于运行时(例如magicMethod readFromStdIO)?
  • 你能说一下你将如何使用这个隐式函数吗?即使有可能,我也看不出它有什么用处

标签: string scala dsl implicit-conversion implicit


【解决方案1】:

简答

不,这不可能。

类型和隐式在编译时解析,而您的 String 的实际值是运行时实体,即它可能在运行之间有所不同。所以在编译时不可能知道哪个字符串值将被传递给隐式函数。

长答案

这可能是可能的,但包含大量的类型魔法,就可读性和实用性而言,这绝对不是一个好的解决方案。

这里的想法是:您可以为您的字符串创建自定义类型并在该类型中编码必要的条件。例如,AString[String[...]] 用于以“a”开头的字符串,String[String[String[StringNil]]] 用于 3 字母字符串,依此类推。

然后,所有字符串转换都会产生适当的类型,例如,当您在 String[...] 前面加上字母 A 时,您将得到 AString[String[...]],等等。

看看dependent typesHList的实现。

但是,在你的情况下,这几乎不实用。

UPD:还可以查看Refined 项目,它提供了类型级别的谓词。

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 2020-01-04
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    • 2021-04-20
    • 2020-07-24
    • 2018-05-05
    相关资源
    最近更新 更多