我有一个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会更加惯用.
在定义了以下简单的树结构之后
data Tree a = Leaf | Branch (Tree a) a (Tree a)
Run Code Online (Sandbox Code Playgroud)
我尝试Foldable为它定义一个实例,只定义foldMap和使用foldrDefault和foldlDefault函数:
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)
当我定义foldl并foldr明确地,它编译.这个错误的文档告诉我有关懒惰的信息,但这在哪里适用?