当函数结果为真时,将函数应用于列表的元素
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
被用了两次。在 cond
和 action
中计算相同的表达式。如何更妥善地解决这个问题?谢谢。
现有的 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.filter
或 Seq.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
我需要在条件为真时迭代列表。我通过下面的函数 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
被用了两次。在 cond
和 action
中计算相同的表达式。如何更妥善地解决这个问题?谢谢。
现有的 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.filter
或 Seq.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