Functional programming 如何将一个列表拆分为两个列表,其中第一个列表包含肯定项,第二个列表包含非肯定项SML

Functional programming 如何将一个列表拆分为两个列表,其中第一个列表包含肯定项,第二个列表包含非肯定项SML,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我是SML的新手,我想写一个拆分函数:int list->int list*int list,给定一个整数列表,它从两个整数列表创建,一个包含非负项,另一个包含负项。 这是我的密码: fun splitup (xs :int list) = if null xs then ([],[]) else if hd xs < 0 then hd xs :: #1 splitup( tl xs) else hd xs :: #2 splitup( tl xs) 函数split

我是SML的新手,我想写一个拆分函数:
int list->int list*int list
,给定一个整数列表,它从两个整数列表创建,一个包含非负项,另一个包含负项。 这是我的密码:

fun splitup (xs :int list) =
  if null xs
  then ([],[])
  else if hd xs < 0
  then hd xs :: #1 splitup( tl xs)
  else hd xs :: #2 splitup( tl xs)
函数splitup(tlxs)应该返回
int list*int list
,所以我认为我的递归应该是正确的。 问题是什么?我如何解决它?

问题是

hd xs :: #1 splitup( tl xs)

是列表–您可以从
中看出–结果应该不是成对的列表

对于非空的情况,您需要首先拆分列表的其余部分,然后将标题附加到结果的正确部分,并将其与结果的其他部分成对添加。
习惯模式匹配也是一个好主意,因为它简化了代码

大概是这样的:

fun splitup [] = ([], [])
  | splitup (x::xs) = let (negatives, non_negatives) = splitup xs
                      in if x < 0 
                         then (x :: negatives, non_negatives)
                         else (negatives, x :: non_negatives)
                      end
fun splitup[]=([],[])
|拆分(x::xs)=let(负片,非负片)=拆分xs
如果x<0
然后(x::否定,非否定)
其他(负片,x::非负片)
结束
问题在于

hd xs :: #1 splitup( tl xs)

是列表–您可以从
中看出–结果应该不是成对的列表

对于非空的情况,您需要首先拆分列表的其余部分,然后将标题附加到结果的正确部分,并将其与结果的其他部分成对添加。
习惯模式匹配也是一个好主意,因为它简化了代码

大概是这样的:

fun splitup [] = ([], [])
  | splitup (x::xs) = let (negatives, non_negatives) = splitup xs
                      in if x < 0 
                         then (x :: negatives, non_negatives)
                         else (negatives, x :: non_negatives)
                      end
fun splitup[]=([],[])
|拆分(x::xs)=let(负片,非负片)=拆分xs
如果x<0
然后(x::否定,非否定)
其他(负片,x::非负片)
结束
已经有了
:('a->bool)->'a list->'a list*'a list
,一个实现此功能的高阶库函数。如果要将整数拆分为(负、非负):

val splitup=List.partition(fn x=>x<0)
已经有了
:('a->bool)->'a list->'a list*'a list
,一个实现此功能的高阶库函数。如果要将整数拆分为(负、非负):

val splitup=List.partition(fn x=>x<0)

当我的递归到达列表的末尾时,它返回列表对,
#1 splitup(xs)
应该是一个列表。那么为什么
::#1对列表
会出错呢?@denngp它会出错,因为它应该是一对列表。正如消息所说,条件的两个分支必须具有相同的类型。当我的递归到达列表的末尾时,它返回列表对,并且
#1 splitup(xs)
应该是一个列表。那么为什么
::#1对列表
会出错呢?@denngp它会出错,因为它应该是一对列表。正如消息所说,条件的两个分支必须具有相同的类型。
val splitup = List.partition (fn x => x < 0)