Sml ML.如何正确使用序列

Sml ML.如何正确使用序列,sml,ml,sequences,Sml,Ml,Sequences,所以我有一个“新的”双向序列: datatype direction = Back | Forward; datatype 'a bseq = bNil | bCons of 'a * (direction -> 'a bseq); 我需要一个函数seq2bseq:'a seq->'a seq->'a bseq,它将两个正则序列“附加”到一个序列中,如下所示: 如果seqUp是01 2 3 4。。。下面是-1-2-3-4。。。然后seq2bseq

所以我有一个“新的”双向序列:

datatype direction = Back | Forward; 
datatype 'a bseq =   bNil 
                | bCons of 'a * (direction -> 'a bseq); 
我需要一个函数seq2bseq:'a seq->'a seq->'a bseq,它将两个正则序列“附加”到一个序列中,如下所示:

如果seqUp是01 2 3 4。。。下面是-1-2-3-4。。。然后seq2bseq将创建-4 -3 -2 -1 0 1 2 3 4 .. . 换句话说,起始元素是seqUp(0)的第一个元素,所以如果我向后移动,我将得到seqDown(-1)的第一个元素,如果我向前移动,则得到seqUp(1)的第二个元素。 到目前为止,我写了以下内容:

fun appendq (Nil, yq) = yq
        | appendq (Cons(x,xf), yq) = Cons(x,fn()=>appendq(xf(),yq));
fun seq2bseq (DownSeq) (UpSeq) =    
        bCons(head(UpSeq), fn (Forward) => seq2bseq appendq(head(UpSeq), DownSeq) tail(UpSeq) 
                            | (Back) => seq2bseq tail(DownSeq) appendq(head(DownSeq), UpSeq) );
对此,我得到以下错误:

stdIn:28.101-28.153 Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z seq * 'Z seq -> 'Z seq
  operand:         'Y seq -> 'Y seq
  in expression:
    seq2bseq tail
stdIn:27.5-28.155 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch]
  expression:  _ seq -> _ bseq
  result type:  _ * _ -> ('Z seq -> 'Z seq) -> _ seq -> _
  in declaration:
    seq2bseq = (fn arg => (fn <pat> => <exp>))
stdIn:28.101-28.153错误:运算符和操作数不一致[tycon不匹配]
操作员域:'Z seq*'Z seq->'Z seq
操作数:“Y序列->”Y序列
在表达上:
seq2bseq尾部
stdIn:27.5-28.155错误:条款右侧与功能结果类型不一致[tycon不匹配]
表达式:seq->bseq
结果类型:*->('Z seq->'Z seq)->seq->_
在声明中:
seq2bseq=(fn arg=>(fn=>)
我想不出怎么了(:/)。救命啊! 谢谢


编辑:工作(?)代码位于:。

您的类型错误似乎是由于缺少括号造成的

如果您有函数
foo
bar
,并且希望调用值
baz
bar
结果调用
foo
,那么您需要将其写成
foo(bar baz)
foo(bar(baz))
,如果您愿意的话

写入
foo-bar(baz)
将导致使用参数
bar
调用
foo
,这可能不会进行类型检查

尝试:


否:(这次我得到:stdIn:30.48-30.77错误:运算符和操作数不一致[circularity]运算符域:“Z seq*”Z seq操作数:“Z seq*”Z seq seq seq in expression:appendq(head-dowseq,UpSeq)有没有一种方法可以将元素添加到序列中?如果不知道
head
tail
在做什么,我就无法判断这里出了什么问题。看起来您的
head
函数的类型是
'Z seq->'Z
,而
appendq
需要两个
'Z seq
,因此您将无法追加re
head
的结果。不过,这只是一个猜测。我不确定你所说的在序列中添加元素是什么意思,所以我不能真正回答这个问题。我知道这是一个很老的问题,但你最后是怎么想出来的?我不确定这个代码有多正确,但我附上了我在“垃圾”中找到的内容。
fun seq2bseq (DownSeq) (UpSeq) =    
    bCons(head(UpSeq),
          fn Forward => seq2bseq (appendq(head(UpSeq), DownSeq)) (tail(UpSeq)) 
           | Back => seq2bseq (tail(DownSeq)) (appendq(head(DownSeq), UpSeq))
         )