Functional programming 如何将一个列表拆分为两个列表,其中第一个列表包含肯定项,第二个列表包含非肯定项SML
我是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
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)