Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 不向返回列表添加任何值_List_F# - Fatal编程技术网

List 不向返回列表添加任何值

List 不向返回列表添加任何值,list,f#,List,F#,我在理解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;; 然而,它返回: val it : int list =

我在理解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;;
然而,它返回:

val it : int list = [0; 0; 0; 3; 0]
而不仅仅是[3],因为我无法在声明中提及其他内容。 另外,我有->int list->int->int list的目标签名,我还得到了其他东西

问题2也是如此,我想提供一个整数,并将从0到这个整数的每个数字打印n次(其中n是迭代值): 例子: 多值3;; 输出:[1;2;2;3;3;3]

我所能做的就是创建列表列表

返回元素时我遗漏了什么? 我如何不向退货中添加任何内容

示例:如果x=n,则n else不添加其他turn

使用
列表。选择:

let indeks lst n =
    lst
    |> List.mapi (fun i s -> if s = n then Some i else None)
    |> List.choose id
对不起,我没注意到你还有第二个问题。为此,您可以使用
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]

这一个遍历原始列表一次,新形成的列表(可能要短得多)遍历一次。

前面的答案非常惯用。以下是一个避免使用选项类型和id的解决方案:

let indeks2 lst n =
    lst
    |> List.mapi (fun i x -> (i,x))
    |> List.filter (fun x -> (fst x) % n = 0 ) 
    |> List.map snd
您可以修改过滤器功能以满足您的需要

如果您计划生成大量序列,探索序列(列表)理解可能是一个好主意:

[for i in 1..10 do
    yield! List.replicate i i]

If语句是F#中的表达式,它们返回一个值。在这种情况下,IF和ELSE分支必须返回相同类型的值。使用Some/None(选项类型)可以解决这个问题。在某些情况下,您可以不使用If

这是对语法的一个很好的概述:列表模块中有很多函数,通常您试图解决的问题已经为您解决了,就像
列表一样。选择
列表。收集
函数。但是如果你不知道它们的存在,就很难使用它们!因此,我建议大家读一读。完成后,在那里阅读本系列的其余部分。那个网站是我找到的学习F#最好的单一资源。
[for i in 1..10 do
    yield! List.replicate i i]