我需要在条件为真时迭代列表。我是通过下面的函数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
中计算相同的表达式。如何正确解决这个问题?感谢。
答案 0 :(得分:3)
您尝试的解决方案是否应该忽略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)
返回
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