как создать тип, который может содержать Int или String - PullRequest
0 голосов
/ 20 июня 2019

Если есть функция f(x), а тип x может быть Int или String, если это Int, то этот f вернет x+1, если это String, тогда 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 :: Either Int String -> Either Int String

f (Left x) = Left (x + 1)

f (Right x) = Right (обратный х)

а в котлине?

Ответы [ 3 ]

0 голосов
/ 20 июня 2019

В kotlin у вас есть Стрелка , которая предоставляет множество функциональных возможностей для языка.Между ними у вас есть EitherT.Это позволяет вам определить:

fun f(x: Either<Int, String>): Either<Int, String> =
    x.bimap({ it+1 }, { it.reversed() })
0 голосов
/ 01 июля 2019

запечатанный класс E

класс данных L (val v: String): 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")))

fun poly2 (expr: E): Есть?= когда (expr) {

is L -> expr.v

is R -> expr.v + 1

}

0 голосов
/ 20 июня 2019

Вы можете сделать что-то вроде:

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

Таким образом, вы можете использовать перегрузку метода, чтобы выполнить работу за вас на основе параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...