如何通过elm中的索引获取列表项?

时间:2014-04-21 14:26:25

标签: list elm

我有一个清单,现在我想要第n项。在Haskell中我会使用!!,但我无法找到它的榆树变体。

3 个答案:

答案 0 :(得分:31)

Elm在0.12.1中添加了数组,并且在0.19中大量修改了实现,以提高正确性和性能。

import Array

myArray = Array.fromList [1..5]

myItem = Array.get 2 myArray

数组是零索引的。目前不支持负指数(我知道这很糟糕)。

请注意myItem : Maybe Int。 Elm尽其所能避免运行时错误,因此越界访问返回一个明确的Nothing

如果您发现自己希望索引到列表而不是头部和尾部,则应考虑使用数组。

Array documentation

答案 1 :(得分:14)

在榆树中没有相同的东西。 你当然可以自己实现它。

(注意:这不是“总”函数,因此当索引超出范围时会产生异常。)

infixl 9 !!
(!!) : [a] -> Int -> a
xs !! n  = head (drop n xs)

更好的方法是使用Maybe数据类型定义一个总函数。

infixl 9 !!
(!!) : [a] -> Int -> Maybe a
xs !! n  = 
  if | n < 0     -> Nothing
     | otherwise -> case (xs,n) of
         ([],_)    -> Nothing
         (x::xs,0) -> Just x
         (_::xs,n) -> xs !! (n-1)

答案 2 :(得分:1)

我用过这个:

(!!): Int -> List a -> Maybe a

(!!) index list =                          -- 3 [ 1, 2, 3, 4, 5, 6 ]

   if  (List.length list) >= index then

        List.take index list               -- [ 1, 2, 3 ]
        |> List.reverse                    -- [ 3, 2, 1 ]
        |> List.head                       -- Just 3
   else 
      Nothing

当然你得到一个Maybe,你需要在使用这个功能时解开它。不能保证你的列表不会是空的,或者你要求一个不可能的索引(如1000) - 这就是为什么elm编译器会强迫你考虑这种情况。

main = 
let 
  fifthElement = 
    case 5 !! [1,2,3,4,255,6] of  // not sure how would you use it in Haskell?! But look's nice as infix function. (inspired by @Daniël Heres)
      Just a ->
        a
      Nothing ->
        -1
in
    div [] 
        [ text <| toString fifthElement ]         // 255