小编Phi*_*orf的帖子

列表包含可以在Kotlin中为可空列表的可空值

我有一个List<T?>包含空值(我想,这是不被禁止的).如果此列表的一个元素为null,我希望整个列表为null(Haskell人们称之为sequence).以下伪代码演示了我想要做的事情:

fun <T> sequence(a : List<T?>) : List<T>? {
    return 
        a.fold(
            listOf(),
            { 
                prevArray, element -> 
                    if(element == null) null else prevArray + element 
            })
}
Run Code Online (Sandbox Code Playgroud)

这是伪代码,因为编译器抱怨这一点Null can not be a value of a non-null type kotlin.collections.List<T>.

什么是在Kotlin表达我想要的东西的惯用方式?使用Java的Optional类型,这至少是可编译的:

fun <T> sequence(a : List<T?>) : Optional<List<T>> {
    return 
        a.fold(
            Optional.of(listOf()),
            { 
                prevArray, element -> 
                    if(element == null) Optional.empty<List<T>>() else Optional.of(prevArray + element) 
            })
}
Run Code Online (Sandbox Code Playgroud)

但是Kotlin在null处理方面有许多运算符和功能,所以我认为直接使用null会更加惯用.

kotlin

4
推荐指数
1
解决办法
1641
查看次数

对于树类型可折叠,"此处的实例值未定义,因此不允许此引用"

在定义了以下简单的树结构之后

data Tree a = Leaf | Branch (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)

我尝试Foldable为它定义一个实例,只定义foldMap和使用foldrDefaultfoldlDefault函数:

instance treeFoldableInstance :: Foldable Tree where
  foldr = foldrDefault
  foldl = foldlDefault
  foldMap f Leaf = mempty
  foldMap f (Branch left a right) = foldMap f left <> (f a) <> foldMap f right
Run Code Online (Sandbox Code Playgroud)

然而,这会导致:

The value of treeFoldableInstance is undefined here, so this reference is not allowed.
Run Code Online (Sandbox Code Playgroud)

当我定义foldlfoldr明确地,它编译.这个错误的文档告诉我有关懒惰的信息,但这在哪里适用?

purescript

3
推荐指数
1
解决办法
186
查看次数

标签 统计

kotlin ×1

purescript ×1