如何从 Elm 数组中过滤掉 "Nothing" 值?

How to filter out "Nothing" values from Elm Array?

我想定义以下函数:

compactAndConvertToList : Array (Maybe String) -> List String

此函数应删除给定数组中所有 Nothing 的出现,并将其转换为 List

我想到了下面的解决方案,但感觉有点脏。

有没有更好的方法来实现这个?

import Graphics.Element exposing (..)
import Array

model : Array.Array (Maybe String)
model = Array.fromList [ Just "Hello", Just "Stack", Nothing, Just "Overflow" ]


compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList maybeStrings =
  maybeStrings
    |> Array.filter (\x -> x /= Nothing)
    |> Array.map (Maybe.withDefault "")
    |> Array.toList


main = 
  model
    |> compactAndConvertToList
    |> show

如果您的最终结果是一个列表,您最好将数组转换为列表,然后对其进行操作。

import Array 

compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList = Array.toList >> List.filterMap identity

如果你不习惯高阶函数,你可以这样写:

compactAndConvertToList arr = List.filterMap identity (Array.toList arr)

我们获取我们的数组,将 toList 应用于它,然后将 filterMap 应用于它。 Filter map 采用一个函数生成一个 maybe,并将其应用于列表中的每个元素,丢弃 Nothing 情况。我们只是应用恒等函数,它会丢弃已经存在的 Nothing 值。

一般来说,数组有利于快速随机访问,但如果您多次遍历整个集合,列表往往会更快。但是,始终以清晰的方式开始,然后在需要时进行优化。

也许这是 2018 年更好的答案。使用 elm-community/maybe-extra 包。

示例:

Maybe.Extra.values [Just 1, Nothing, Just 3]

Returns:

[1,3]