Существуют ли элегантные способы превратить Список в NonEmptyList в kotlin и arrow?

fun main() {
    val list = listOf(1, 2, 3, 4, 5) 

    if (list.isNotEmpty()) {
        Nel(list[0], list.subList(1, list.lastIndex))
    }
}

Согласно документам стрелка, кажется, сможет сделать это через Semigroup или же Monad binding, Тем не менее, нет кода для замены List с NonEmptyList,

Есть ли лучший способ заменить List сNonEmptyList без использования subList?

2 ответа

Решение

Есть сопутствующая функция fromList что вернуть Option<NonEmptyList> или если вы уверены, что используете fromListUnsafe:

val list = listOf(1, 2, 3, 4, 5)

val nelistOption = NonEmptyList.fromList(list)

val nelist = NonEmptyList.fromListUnsafe(list)

В Arrow 1.1.3 представлен более идиоматический способ Колтина для достижения этой цели с введением Iterable.toNonEmptyListOrNull(): NonEmptyList?

Пример:

      val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: NonEmptyList<Int>? = list.toNonEmptyListOrNull()

Чтобы получить старыйOptionможно использоватьtoOption()функция расширения

      val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: Option<NonEmptyList<Int>> = list.toNonEmptyListOrNull().toOption()

или используйте Option.fromNullable()

      val list: List<Int> = listOf(1, 2, 3)
val nonEmptyList: Option<NonEmptyList<Int>> = Option.fromNullable(list.toNonEmptyListOrNull())

Функция NonEmptyList.fromList() теперь устарела в пользу toNonEmptyListOrNull.

Другие вопросы по тегам