如何将列表拆分为两个列表,其中第一个具有正条目,第二个具有非正条目-SML

how to split a list into two lists in which the first has the positive entries and the second has non-positive entries-SML

我是 SML 的新手,我想编写一个函数 splitup :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)

这是我收到的警告:

ERROR : operator and operand don't agree
ERROR : types of if branches do not agree

函数 splitup(tl xs) 应该 return int list * int list 所以我认为我的递归应该是好的。 有什么问题,我该如何解决?

问题在于

hd xs :: #1 splitup( tl xs)

hd xs :: #2 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

已经有 List.partition: ('a -> bool) -> 'a list -> 'a list * 'a list,一个执行此操作的高阶库函数。如果您想将整数拆分为(负数,非负数):

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