如果有一个函数f(x)
,并且x的类型可能是Int或String,
如果它是Int,则此f将返回x+1
如果它是字符串,则f会将x反转并返回。
这在python和javascript之类的动态类型语言中很容易
仅使用isinstance(x, Int)
。
我们可以知道它的类型,并使用if-else做一些事情, 但是在像kotlin这样的静态类型语言中,我不知道该怎么做? 因为我不知道如何使x具有可能是Int或String的类型。
def f(x):
if isinstance(x, int):
return x+1
if isinstance(x, str):
return x[::-1]
在haskell中,我们可以进行模式匹配
f ::任何一个Int字符串->任何一个Int字符串
f(左x)=左(x + 1)
f(右x)=右(x反向)
还有科特林?
答案 0 :(得分:0)
在kotlin中,您拥有Arrow,可为该语言提供很多功能。他们之间有EitherT
。
这样就可以定义:
fun f(x: Either<Int, String>): Either<Int, String> =
x.bimap({ it+1 }, { it.reversed() })
答案 1 :(得分:0)
密封E级
数据类L(val v:字符串):E()
数据类R(val v:Int):E()
fun poly(expr:E):E = when(expr){
is L -> L(expr.v)
is R -> R(expr.v + 1)
}
println(poly(poly(R(3))))
println(poly(L(“ aha”)))
有趣的poly2(expr:E):有吗? = when(expr){
is L -> expr.v
is R -> expr.v + 1
}
答案 2 :(得分:-1)
您可以执行以下操作:
fun getValue(id: Int): Any { ... }
fun process(value: Int) { ... }
fun process(value: String) { ... }
val value = getValue(valueId)
when (value) {
is Int -> process(value)
is String -> process(value)
else -> ... }
这样,您可以使用方法重载根据参数为您完成工作。