gpt4 book ai didi

elm - 在 Elm 中获取 List 的下一个元素的最佳方法

转载 作者:行者123 更新时间:2023-12-01 07:52:26 26 4
gpt4 key购买 nike

我目前正试图找出遍历列表的最佳方式。
我说的穿越是什么意思?

示例:

我有一个用户列表:

userList : List User 
userList =
[user, user, user, user]

我有一个 currentUser,它必须是 userList 之外的用户

所以我想要实现的是:
我想要像 List.getNext 这样的东西,它接受 userList 和当前用户并返回列表中的下一个用户,相对于 currentUser

这是我的实现。我认为这非常复杂 - 那么有没有人知道如何以更好的方式做到这一点?
traverseList : List a -> a -> Maybe (Maybe a)
traverseList list currentElement =
let
indexList =
List.indexedMap
(\index element ->
if element == currentElement then
index
else
-1
)
list

currentAsIndex =
let
mayBeIndex =
List.maximum indexList
in
case mayBeIndex of
Just index ->
index

Nothing ->
0

getWanted =
List.map
(\( id, element ) ->
if id == (currentAsIndex + 1) then
Just element
else
Nothing
)
(List.indexedMap (,) list)
|> List.filter
(\element ->
element /= Nothing
)
|> List.head

in
getWanted

说明:

我的方法是获取列表,制作给定列表的索引列表(看起来像这样 [-1, -1, -1, 3, -1, -1])

然后我得到这个列表的最大值 - 因为这给了我当前用户在 List.indexedMap 中的位置。

然后我将原始元素作为 List.indexedMap 迭代并找出下一个(在我们的例子中是第 4 号)并返回该元素。否则我什么都不回。

然后我过滤了这个 Nothings 列表和一个用户,并使用 List.head 从列表中提取用户。

结果是一个Maybe(Maybe user)......这不太好......或者?

感谢您以更好的功能方式做这样的事情的任何想法。

我真的试图在函数式编程中变得更好..

最佳答案

这是一个非常幼稚的递归解决方案:

getWanted  : List a -> a -> Maybe a
getWanted list currentElement =
let findNextInList l = case l of
[] -> Nothing
x :: [] -> if x == currentElement
then List.head list
else Nothing
x :: y :: rest -> if x == currentElement
then Just y
else findNextInList (y :: rest)
in
findNextInList list

这里的想法是查看列表的前两个元素,如果第一个是当前元素,则取第二个。如果没有,请使用列表的尾部再试一次。

必须处理极端情况(您可以为此函数编写至少 4 个单元测试):
  • 根本找不到当前元素
  • 当前元素是列表中的最后一个
  • 列表可能为空

  • 也许有更优雅的解决方案,但递归是函数式编程中非常常见的技术,所以我想分享这种方法。

    关于elm - 在 Elm 中获取 List 的下一个元素的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43305397/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com