我想定义以下功能:
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}}
答案 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]