如何将列表拆分为两个列表,其中第一个具有正条目,第二个具有非正条目-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)
我是 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)