F#:过滤掉所有内容,仅保留部分内容

时间:2019-02-28 08:53:45

标签: f#

有关如何有效分组/过滤列表/序列的快速问题。

  1. 仅过滤可选字段不是None的记录
  2. 删除“ option”参数以简化以后的流程(因为未过滤掉任何内容)
  3. 组(我相信这没问题)

我使用的是最佳方法吗?

谢谢!

type tmp = {
    A : string
    B : int option }

type tmp2 = {
    A : string
    B : int }



let inline getOrElse (dft: 'a) (x: 'a option) =
    match x with
    | Some v -> v
    | _      -> dft

let getGrouped (l: tmp list) =
    l |> List.filter  (fun a -> a.B.IsSome)
      |> List.map  (fun a -> {A = a.A ; B = (getOrElse 0 (a.B)) })
      |> List.groupBy (fun a -> a.A)

2 个答案:

答案 0 :(得分:7)

涉及map+filter时,option最自然的方法是使用choose,它结合了这两个操作并从过滤后的输出中删除选项包装。

您的示例如下所示:

let getGrouped (l: tmp list) =
    l
    |> List.choose (fun a ->
       a.B 
       |> Option.map (fun b -> {A = a.A; B = b})
    |> List.groupBy (fun a -> a.A)

答案 1 :(得分:2)

简单的解决方案是使用可以转换选项以包含一个或零个元素的列表的属性,然后可以定义一个函数,如:

dateInput2 <- function(inputId, label, minview = "days", maxview = "decades", ...) {
  d <- shiny::dateInput(inputId, label, ...)
  d$children[[2L]]$attribs[["data-date-min-view-mode"]] <- minview
  d$children[[2L]]$attribs[["data-date-max-view-mode"]] <- maxview
  d
}

dateRangeInput2 <- function(inputId, label, minview = "days", maxview = "decades", ...) {
  d <- shiny::dateRangeInput(inputId, label, ...)
  d$children[[2L]]$children[[1]]$attribs[["data-date-min-view-mode"]] <- minview
  d$children[[2L]]$children[[3]]$attribs[["data-date-min-view-mode"]] <- minview
  d$children[[2L]]$children[[1]]$attribs[["data-date-max-view-mode"]] <- maxview
  d$children[[2L]]$children[[3]]$attribs[["data-date-max-view-mode"]] <- maxview
  d
}