我想定义以下函数:
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往往会更快.但是,总是从明确的方式开始,然后根据需要进行优化.
也许这是一个更好的答案,如2018年.使用榆树社区/可能额外的包.
例:
Maybe.Extra.values [Just 1, Nothing, Just 3]
Run Code Online (Sandbox Code Playgroud)
返回:
[1,3]
Run Code Online (Sandbox Code Playgroud)