如何获取Elm中Array/List中给定元素的第一个索引?

Mis*_*hko 5 arrays list elm

在Javascript中,可以使用indexOf来获取数组中给定元素的第一个实例.

榆树最好的办法是什么?

array = Array.fromList ["Stack","Overflow","is","","awesome"]
element = ""

indexOf element array =
  -- should return 3
Run Code Online (Sandbox Code Playgroud)

如果我们有一个列表而不是一个数组怎么办?

Dob*_*eer 7

有一个第三方模块elm-list-extra提供此功能." elemIndex "(适用于0.19).

而这个<0.19 elemIndex


Fra*_*itt 6

只是为了好玩,这里是List的手动滚动版本:

helper : List a -> a -> Int -> Int
helper lst elem offset = 
  case lst of
    []      -> -1
    x :: xs ->
      if x == elem then offset
      else helper xs elem (offset + 1)

indexOf lst element =
  helper lst element 0
Run Code Online (Sandbox Code Playgroud)

helper递归地在列表中搜索元素,跟踪到目前为止我们访问过的元素数量.对于空列表,它返回-1.如果您不喜欢魔术常量,则可以轻松地将返回类型更改为Maybe Int并返回Nothing.

这是一个使用它的完整程序(只需复制+粘贴到elm-lang.org的在线REPL :

import Html exposing (text)

lst = ["Stack","Overflow","is","","awesome"]
element = ""

helper : List a -> a -> Int -> Int
helper lst elem offset = 
  case lst of
    []      -> -1
    x :: xs ->
      if x == elem then offset
      else helper xs elem (offset + 1)

indexOf lst element =
  helper lst element 0

main =
  text (toString (indexOf lst ""))    
Run Code Online (Sandbox Code Playgroud)