31

我有一个列表,现在我想要第 n 个项目。在 Haskell 中我会使用!!,但我找不到它的 elm 变体。

4

3 回答 3

41

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

import Array

myArray = Array.fromList [1..5]

myItem = Array.get 2 myArray

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

请注意myItem : Maybe Int. Elm 尽其所能避免运行时错误,因此越界访问返回显式Nothing.

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

数组文档

于 2014-10-07T01:16:41.700 回答
14

在 Elm 中没有类似的东西。你当然可以自己实现它。

(注意:这不是一个“总计”函数,因此当索引超出范围时它会创建一个异常)。

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)
于 2014-04-21T16:43:17.733 回答
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
于 2016-11-10T14:13:40.513 回答