我有一个清单,现在我想要第n项。在Haskell中我会使用!!
,但我无法找到它的榆树变体。
答案 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
。
如果您发现自己希望索引到列表而不是头部和尾部,则应考虑使用数组。
答案 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