List 为什么我的concat列表顺序错误?

List 为什么我的concat列表顺序错误?,list,f#,functional-programming,tail-recursion,List,F#,Functional Programming,Tail Recursion,我正在尝试制作一个示例函数tail recursive。 以下是原始函数: let rec s xs ys = match (xs, ys) with |([],[]) -> [] |(xs, []) -> xs |([], ys) -> ys |(x::xs,y::ys) -> x::y::s xs ys 下面是我尝试使其成为尾部递归: let sC xs ys = let rec sCTR xs ys acc =

我正在尝试制作一个示例函数tail recursive。 以下是原始函数:

let rec s xs ys =
    match (xs, ys) with
    |([],[]) -> []
    |(xs, []) -> xs
    |([], ys) -> ys
    |(x::xs,y::ys) -> x::y::s xs ys
下面是我尝试使其成为尾部递归:

let sC xs ys =
    let rec sCTR xs ys acc =
        match (xs, ys) with
        |([],[]) -> acc
        |(xs, []) -> acc@xs
        |([], ys) -> acc@ys
        |(x::xs,y::ys) -> sCTR xs ys acc@[x]@[y]

    sCTR xs ys []
然而,我的问题是,这些项目的顺序都是错误的。 当我在第一个函数中输入列表[1;2;3;][7;8;]时,我得到结果[1;7;2;8;3] 但是当我在第二个函数中输入[1;2;3;][7;8;]时,我得到了[3;2;8;1;7]


为什么订单错了?我以为list1@list2将产生一个新的列表,其顺序是先列出1个元素,然后列出2个元素

您刚才假定了
@
的错误优先级;你所得到的被解释为

(sCTR xs ys acc)@[x]@[y]
但你想要的是

sCTR xs ys (acc@[x]@[y])

您刚刚假定了
@
的错误优先级;你所得到的被解释为

(sCTR xs ys acc)@[x]@[y]
但你想要的是

sCTR xs ys (acc@[x]@[y])

啊,我明白了。这很有道理——非常感谢。一旦计时器用完,我会把它标记为正确答案。作为更一般的规则——函数应用程序总是比运算符具有更高的优先级。啊,我明白了。这很有道理——非常感谢。一旦计时器用完,我会将其标记为正确答案。作为更一般的规则,函数应用程序总是比运算符具有更高的优先级。