箭头透镜不允许我将可为 null 的属性设置为 null

xle*_*ier 1 functional-programming kotlin arrow-kt

给出这个(极其简化的)代码:

@optics
data class MigrationStatus(val token: String?)

val m = MigrationStatus(null)
Run Code Online (Sandbox Code Playgroud)

我可以打电话

val m1 = MigrationStatus.token.modify(m) { "some token" }
Run Code Online (Sandbox Code Playgroud)

但由于参数类型是不可为空的String,我怎样才能修改token回呢null?当然

val m2 = MigrationStatus.token.modify(m1) { null }
Run Code Online (Sandbox Code Playgroud)

不编译。

当尝试将其设置为 时将token类型更改为 an时,也会发生同样的情况,但我避免了它,因为它现在已被弃用(我不确定我喜欢,但那是另一回事)。Option<String>None

我错过了一些明显的事情吗?

nom*_*Rev 6

编译@Optics器为该属性生成 2 个光学器件。

MigrationStatus.token&MigrationStatus.tokenNullableMigrationStatus.tokenOption在 的情况下Option

这是因为这里有两个不同的Optics有用之处。

  • Lens其中有set& get,在本例中为 `Lens<MigrationStatus, String?>
  • Optional其中有set& getOption,在本例中为 `Optional<MigrationStatus, String>

第一个是您在本例中想要使用的,以便能够设置String?null

所以MigrationStatus.tokenNullable.set(null)

后者对于 DSL 和光学组合更有用,因为如果String?您没有另一个数据类或密封类,您只想在非空的情况下对值进行操作。

我希望完全回答您的问题!