我正在使用以下函数在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
答案 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)