F#函数参数类型不匹配

时间:2017-09-21 02:29:57

标签: list function f#

我正在使用以下函数在F#中创建两个列表的元组

let rec MyOwnZipper xs ys =
    match xs,ys with
    | [],l| l,[]  -> []
    | x1::rest, y1::yrest -> (x1, y1) :: (MyOwnZipper rest yrest) 

在使用像

这样的整数列表调用函数时,它工作正常
System.Console.WriteLine( MyOwnZipper [1; 2; 3] [4; 5; 6] )

当我将参数更改为字符串

时出现问题
 System.Console.WriteLine( MyOwnZipper [1; 2; 3] ["Hello"; "World"; "Peace"] )

我收到以下错误

 error FS0001: This expression was expected to have type
    int    
but here has type
    string    

exit status 1

1 个答案:

答案 0 :(得分:3)

这是因为match表达式的第一种情况:

       | [],l| l,[]  -> []

此处,标识符l被绑定到第一个列表或第二个列表。由于标识符不能同时具有两种不同的类型,因此编译器断定列表必须具有相同的类型。因此,如果您尝试使用不同类型的列表调用该函数,则会出现类型不匹配错误。

要解决此问题,请在两种不同的情况下解决问题:

let rec MyOwnZipper xs ys =
    match xs,ys with
    | [],l  -> []
    | l,[]  -> []
    | x1::rest, y1::yrest -> (x1, y1) :: (MyOwnZipper rest yrest)