如何过滤掉Elm Array中的“Nothing”值?

时间:2015-10-13 02:56:46

标签: elm maybe

我想定义以下功能:

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

我想出了下面的解决方案,但感觉很脏。

有没有更好的方法来实现这一目标?

{{1}}

2 个答案:

答案 0 :(得分:20)

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

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。过滤器映射采用一个生成一个可能的函数,并将其应用于列表中的每个元素,丢弃Nothing个案例。我们只应用身份函数,它们会丢弃已存在的Nothing值。

一般来说,Arrays适用于快速随机访问,但如果你多次遍历整个集合,Lists往往会更快。但是,总是从明确的方式开始,然后根据需要进行优化。

答案 1 :(得分:7)

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

示例:

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

返回:

[1,3]