Sml 使用中缀运算符连接列表中的所有元素

Sml 使用中缀运算符连接列表中的所有元素,sml,smlnj,Sml,Smlnj,所以我有一个列表,比如说[t,f,f,t,f]和一个中缀操作符。我想连接这些元素,以便最终结果如下所示。但我遇到的问题是,我得到了这个结果t(f(tf))。我知道为什么会发生这种情况,因为复活会返回所有以前的元素,但我不知道如何修复它 这是我的代码: fun connect(l) = case l of x::[] => x | x::xs => x1 <==> connect(xs); fun connect(l)= 案例一 x::[]

所以我有一个列表,比如说[t,f,f,t,f]和一个中缀操作符。我想连接这些元素,以便最终结果如下所示。但我遇到的问题是,我得到了这个结果t(f(tf))。我知道为什么会发生这种情况,因为复活会返回所有以前的元素,但我不知道如何修复它

这是我的代码:

fun connect(l) =
    case l of
      x::[] => x
      | x::xs => x1 <==> connect(xs);
fun connect(l)=
案例一
x::[]=>x
|x::xs=>x1连接(xs);
最终结果将如下所示

问题是我得到了这个结果t(f(tf(tf))

xyz
可能意味着
(xy)z
x(yz)

如果折叠到一侧有问题,请尝试折叠到另一侧:

fun connectLeft (x::xs) = foldl (op <==>) x xs
fun connectRight (x::xs) = foldr (op <==>) x xs
  • &&
    不是SML内置逻辑and运算符的名称,该运算符称为
    andalso
    。如果
    xy
    返回一个
    bool
    ,那么您可能想在这里使用
  • 由于
    connect
    假定返回
    bool
    或某个用户定义的真实值,因此可能
    connect[x]=x
    ,但可能不是
  • 在任何情况下,都应该考虑
    connect[]
    :这里是否有一个好的默认值,这样函数就不会在空列表上崩溃

如果您想使用列表组合符(如
map
foldl
等)而不是手动递归来编写此代码,您可以执行以下操作:

  • 将输入列表转换为成对列表,使
    [x,y,z]
    变成
    [(x,y),(y,z)]
    。有一个名为
    zip
    的SML函数,隐藏在库
    ListPair
    中。。。以下几个示例可能会提示如何执行此操作:

    ListPair.zip [x1,x2,x3] [y1,y2,y3] = [(x1,y1), (x2,y2), (x3,y3)]
    ListPair.zip [x1,x2,x3] [x1,x2,x3] = [(x1,x1), (x2,x2), (x3,x3)]
    ListPair.zip [x1,x2,x3] [y2,y3]    = [(x1,y2), (x2,y3)]
    
  • 在配对列表上调用
    map(op)

  • 使用一些
    &&
    操作符将结果折叠起来


  • 这将工作,正如你所描述的,但不幸的是,这不是我所期待的结果。因为我想要这个结构。如果所有元素都是关联的(比如equalIf是关联的)(在数学意义上),那么语法树向哪个方向倾斜就不重要了,因为任何组合都会使用预顺序遍历来明确地破译。当你说“我想要这个结构x y z”时,你是什么意思?当然,不管您组合元素的顺序如何,最终,某个元素必须与另一个元素组合,最终它们的组合必须与第三个元素组合,在这一点上,您有隐式括号。我不能说这个问题还可以回答。>_也许“x y z”意味着“x等于y,y等于z(,x也等于z)”?在这种情况下,我可以看出“x(yz)”是如何不同的,因为“t(ff)”将给出t而不是f。也许你可以澄清你的问题,如果这个或其他解释是正确的。是的,这正是你在第二个例子中的意思。基本上,在列表中,两个元素之间的相等性,也比其他两个元素相等。如果我们有3个元素,就有2个等式,如果我们有4个元素,就有3个性取向。或者假设我举了一个例子,我们有列表等式[x,y,z]。这在数学上意味着(xy)&(yz)。这就是为什么我没有把()放在那里,而只是普通的y z。我希望我现在更具体一些:)谢谢,这就是我要找的:)在我将我的配对映射到如何使用中缀折叠后,只有一个问题。因为foldr(op&&)x xs不会给出预期的结果
    ListPair.zip [x1,x2,x3] [y1,y2,y3] = [(x1,y1), (x2,y2), (x3,y3)]
    ListPair.zip [x1,x2,x3] [x1,x2,x3] = [(x1,x1), (x2,x2), (x3,x3)]
    ListPair.zip [x1,x2,x3] [y2,y3]    = [(x1,y2), (x2,y3)]