将函数应用于列表的元素,而条件的函数结果为true

时间:2016-02-16 02:09:45

标签: f# c#-to-f#

我需要在条件为真时迭代列表。我是通过下面的函数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中计算相同的表达式。如何正确解决这个问题?感谢。

2 个答案:

答案 0 :(得分:3)

您尝试的解决方案是否应该忽略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)

返回

145
10
17
50

答案 1 :(得分:2)

现有的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