应用程序可以在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实现柯里化)
任何想法欢迎。