【问题标题】:Return a single record from a list of records in Elm从 Elm 的记录列表中返回一条记录
【发布时间】:2016-06-04 07:25:37
【问题描述】:

我试图在满足条件时从记录列表中返回一条记录。 现在,当条件为 false 时,我正在返回一个包含空字段的记录。

这样好吗? 有没有更好的办法?

xs =
    [ { name = "Mike", id = 1 }
    , { name = "Paul", id = 2 }
    , { name = "Susan", id = 3 }
    ]


getNth id xs =
    let
        x =
            List.filter (\i -> i.id == id) xs
    in
        case List.head x of
            Nothing ->
                { name = "", id = 0 }

            Just item ->
                item

【问题讨论】:

  • 如果它工作正常,那么可能没问题,不是吗?
  • 我不知道我是否理解正确你的问题,但也许你正在寻找package.elm-lang.org/packages/elm-lang/core/4.0.1/Maybe
  • @Edvin Tenovim 是的,它正在工作,但我觉得我做的工作太多了。这就是为什么我认为也许我缺少一种更简单/惯用的方式。
  • @JoseOrtega 为什么不将List.filter (\i -> i.id == id) xs 作为Maybe Item 返回,然后在调用函数中处理这些情况?
  • 好吧,也许 :) 但是为了在另一个函数中使用结果,我可能不得不用另一个 case 表达式来检查这个,对吧?

标签: elm


【解决方案1】:

核心List 包中没有列表搜索功能,但社区List-Extra 中有一个。有了这个函数,就可以写出上面的程序了:

import List.Extra exposing (find)

getNth n xs =
  xs 
  |> find (.id >> (==) n)
  |> Maybe.withDefault { id = n, name = "" }

在 Elm 中处理“可能没有值”的规范方法是返回一个 Maybe 值——这样,getNth 的用户可以选择当他正在寻找的值时应该做什么找不到。所以我宁愿省略最后一行,得到非常整洁的:

getNth n = find (.id >> (==) n)

【讨论】:

  • 好吧,我寻求了一个类似于 @marcosh List.filter (\i -> i.id == id) xs 的解决方案,但我将其标记为已接受的答案,因为它提供了另一种观点。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 2021-02-17
  • 2018-03-15
相关资源
最近更新 更多