Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F#从两个列表中生成配对列表_F# - Fatal编程技术网

F#从两个列表中生成配对列表

F#从两个列表中生成配对列表,f#,F#,我需要在F#中创建一个函数,将两个列表中的元素配对在一起(请参见下图(ii)): 实际上,我并不完全确定问题是什么:我是否需要创建一个函数,该函数接受两个列表并返回一个对列表,其中结果列表中的第I个元素是一对,其中对中的第一个元素是第一个列表中的第I个元素,对中的第二个元素是第二个列表中的第I个元素?我不明白*在val-pairlists:'a list*'b list->('a*'b)list 如果这就是我应该做的,那么下面就是我尝试过的: let pairlists (l : 'a list

我需要在F#中创建一个函数,将两个列表中的元素配对在一起(请参见下图(ii)): 实际上,我并不完全确定问题是什么:我是否需要创建一个函数,该函数接受两个列表并返回一个对列表,其中结果列表中的第I个元素是一对,其中对中的第一个元素是第一个列表中的第I个元素,对中的第二个元素是第二个列表中的第I个元素?我不明白
*
val-pairlists:'a list*'b list->('a*'b)list

如果这就是我应该做的,那么下面就是我尝试过的:

let pairlists (l : 'a list) (m : 'b list) =
    if l.Length <> m.Length then 
        failwith "the two lists does not have the same size"
    else 
        [for i in 1 .. l.Length do
            yield (l.Head,m.Head)

        ]
let配对列表(l:a列表)(m:b列表)=
如果l.长度m.长度那么
failwith“两个列表的大小不同”
其他的
[对于1..l.长度中的i
收益率(长水头、米水头)
]
我不知道该怎么做,因为我不知道如何遍历列表?
帮助

您可以通过模式匹配来迭代列表,这是使用
匹配。。。使用
表达式

例如:

f l = 
   match l with
   | head :: tail -> "This list has at least one element!"
   | _ -> "This list is empty"

> f [1]
> "This list has at least one element!"

> f [1; 2]
> "This list has at least one element!"

> f []
> "This list is empty"
在您的情况下,可能有几种可能性:两个列表都是空的,一个是空的,另一个不是空的,或者都至少有一个元素:

pairlists l m =
    match l, m with
    | (lhead :: ltail), (mhead :: mtail) ->  // both non-empty
    | [], (mhead :: mtail) ->  // first list empty, second is not
    | (lhead :: ltail), [] ->  // second is empty, first is not
    | [], [] ->  // both are empty
现在,您需要做的就是决定这四种情况下函数的结果应该是什么,然后写下来


我不会给你完整的答案,因为这显然是家庭作业,但这里有另一个提示:配对两个非空列表意味着配对头(即第一个元素),然后配对尾,然后将两者连接在一起。

函数签名中的
*
表示输入是两个列表的元组,输出是元组列表。 实现这一点的最简单方法是使用List.zip函数:

let pairlists ((a, b) : 'a list * 'b list) = 
    List.zip a b

在这里,我们将输入参数定义为“a列表”和“b列表”的元组,并将列表传递到
list.zip:'T1 list->'T2 list->('T1*'T2)list
,尽管它可能是家庭作业。这就是说,他们确实明确指出,列表的大小应该相同,因为在使用
zip
时,其他任何内容都应该提供更有力的建议。