我在理解F#如何工作方面遇到了问题.我来自C#,我认为我正在努力使F#像C#一样工作.我最大的问题是以正确的格式返回值.
示例:假设我有一个带有整数和整数列表的函数.函数应该打印索引列表,其中列表匹配的值传递整数.
我的代码:
let indeks myList n = myList |> List.mapi (fun i x -> if x=n then i else 0);;
indeks [0..4] 3;;
Run Code Online (Sandbox Code Playgroud)
然而它返回:
val it : int list = [0; 0; 0; 3; 0]
Run Code Online (Sandbox Code Playgroud)
而不只是[3],因为我不能在该陈述中忽略其他.我还有 - > int list - > int - > int list的签名,我得到了别的东西.
同样的问题没有.2我想提供一个整数并打印从0到这个整数n次的每个数字(其中n是迭代值):示例:MultiplyValues 3 ;; 输出:[1; 2; 2; 3; 3; 3]
我能做的最好就是创建列表清单.
返回元素时我错过了什么?如何在返回
示例中不添加任何内容:if x = n then n else AddNothingToTheReturn
用途List.choose:
let indeks lst n =
lst
|> List.mapi (fun i s -> if s = n then Some i else None)
|> List.choose id
Run Code Online (Sandbox Code Playgroud)
对不起,我没注意到你有第二个问题.为此您可以使用List.collect:
let f (n : int) : list<int> =
[1 .. n]
|> List.collect (fun s -> List.init s (fun t -> s))
printfn "%A" (f 3) // [1; 2; 2; 3; 3; 3]
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请阅读List.collect的文档.
编辑
以下s952163是第一个没有Option类型的解决方案的另一个版本:
let indeks (lst : list<int>) (n : int) : list<int> =
lst
|> List.fold (fun (s, t) u -> s + 1, (if u = n then (s :: t) else t)) (0, [])
|> (snd >> List.rev)
Run Code Online (Sandbox Code Playgroud)
这一次遍历原始列表一次,并且(可能短得多)新形成的列表一次.
| 归档时间: |
|
| 查看次数: |
143 次 |
| 最近记录: |