应用程序可以在kotlin中“很好地”实现吗?

我已经定义了一个Result类型,如下所示:

 sealed class BadResult { data class Description(val description: String): BadResult() data class Exception (val exception : Throwable): BadResult() } sealed class BadTree { data class Leaf(val v: BadResult) : BadTree() data class Fork(val l: BadTree, val r: BadTree) : BadTree() } sealed class Result<T> { data class Good<T> (val good : T ) : Result<T>() class Empty<T> : Result<T>() data class Bad <T> (val badTree : BadTree ) : Result<T>() } fun <T> T.good() : Result<T> = Result.Good(this) fun <T> empty() : Result<T> = Result.Empty() fun <T> BadTree.bad() : Result<T> = Result.Bad<T>(this) fun <T> String.bad() : Result<T> = BadTree.Leaf(BadResult.Description(this)).bad() fun <T> Throwable.bad() : Result<T> = BadTree.Leaf(BadResult.Exception(this)).bad() 

对于这个Result类,我定义了monadic bind

 infix fun <T, U> Result<T>.bind(uf: (T) -> Result<U>) : Result<U> { return when(this) { is Result.Good -> uf(this.good) is Result.Empty -> empty() is Result.Bad -> this.badTree.bad() } } 

一个非常有用的函数模式是Applicative ,如果应用于Result这将允许我调用带有arbritrary参数列表的函数,当且仅当所有参数都是Good

这是一种通常依赖部分应用(又名咖喱)的技术,AFAIK在kotlin中不支持开箱即用。 我见过一些图书馆尝试做柯里化,但在我看来,柯林并不是一个公认的科林语成语。

我最想写的是这样的:

 pure(::aFunctionThatTakes3Args) apply arg1 apply arg2 apply arg3 

但我不能想出签名应该是什么样子。

我可以为函数的每一个元素设置一个lift函数,但是很快就会变得很麻烦。

 lift(::aFunctionThatTakes3Args, arg1, arg2, arg3) // lift is overloaded for each arity 

(这似乎是如何funKTionale实现柯里化)

任何想法欢迎。