当函数结果为真时,将函数应用于列表的元素

Apply function to elements of a list while condition with function's result is true

我需要在条件为真时迭代列表。我通过下面的函数 iterc 完成了该操作:

let data = [12; 3; 4; 56; 7]
let restriction = 146
let convert elem = pown elem 2 + 1

let rec iterc (cond : ('T -> bool)) (action : ('T -> unit)) (list : 'T list) =
    match list with
    | head::tail ->
        match (cond head) with
        | true ->
            action head
            iterc cond action tail
        | false -> ()
    | [] -> ()

iterc ((>) restriction << convert)
      (printfn "%A" << convert)
      data

> 145
  10
  17

我不喜欢 convert 被用了两次。在 condaction 中计算相同的表达式。如何更妥善地解决这个问题?谢谢。

现有的 F# 函数似乎可以满足您的需求。
你可以这样写你上面的大部分内容:

let data = [12; 3; 4; 56; 7]
let restriction = 146
let convert elem = pown elem 2 + 1

for value in data |> Seq.map convert |> Seq.takeWhile ((>) restriction) do
    printfn "%A" value

您尝试的解决方案是否应该忽略数据点 7?我假设不是这样。 Squimmy 发布的解决方案有一个错误,因为它使用 Seq.takeWhile 而不是 Seq.filterSeq.where。您可能想要的是以下内容:

let data = [12; 3; 4; 56; 7]
let restriction = 146
let convert elem = pown elem 2 + 1

data |> List.map (fun value -> convert value ) 
     |> List.filter (fun value -> value < restriction) 
     |> List.iter(fun value -> printfn "%A" value)

returns

145
10
17
50