我有一个列表,现在我想要第 n 个项目。在 Haskell 中我会使用!!
,但我找不到它的 elm 变体。
问问题
18461 次
3 回答
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 回答