如何创建可能包含Int或String的类型

时间:2019-06-20 06:56:15

标签: python kotlin polymorphism

如果有一个函数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反向)

还有科特林?

3 个答案:

答案 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 -> ... }

这样,您可以使用方法重载根据参数为您完成工作。

相关问题