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

Mis*_*hko 12 maybe elm

我想定义以下函数:

compactAndConvertToList : Array (Maybe String) -> List String
Run Code Online (Sandbox Code Playgroud)

此函数应删除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
Run Code Online (Sandbox Code Playgroud)

jmi*_*ite 21

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

import Array 

compactAndConvertToList : Array.Array (Maybe String) -> List String
compactAndConvertToList = Array.toList >> List.filterMap identity
Run Code Online (Sandbox Code Playgroud)

如果您对高阶函数不满意,可以这样写:

compactAndConvertToList arr = List.filterMap identity (Array.toList arr)
Run Code Online (Sandbox Code Playgroud)

我们获取数组,将toList应用于它,然后将filterMap应用于它.过滤器映射采用生成一个可能的函数,并将其应用于列表中的每个元素,从而丢弃Nothing案例.我们只应用标识函数,它们丢弃Nothing已存在的值.

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


Jak*_*lak 8

也许这是一个更好的答案,如2018年.使用榆树社区/可能额外的包.

例:

Maybe.Extra.values [Just 1, Nothing, Just 3]
Run Code Online (Sandbox Code Playgroud)

返回:

[1,3]
Run Code Online (Sandbox Code Playgroud)