Functional programming 如何清理特定字符串的列表并返回清理后的列表或无
我需要编写一个函数来回答这些规范:Functional programming 如何清理特定字符串的列表并返回清理后的列表或无,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我需要编写一个函数来回答这些规范: clean_list([],s1]=NONE clean_list(xs,”)=NONE clean_list([s1,s1,s1,s1],s1)=无 clean_list([s1,s2,s3,s2,s1],s3)=[s1,s2,s2,s1] 其中,s1,s2,s3是一些字符串,xs是字符串列表 我可以使用两个助手函数is_into(xs:string list,s1:string)->bool和remove(xs:string list,s1:string)
clean_list([],s1]=NONE
clean_list(xs,”)=NONE
clean_list([s1,s1,s1,s1],s1)=无
clean_list([s1,s2,s3,s2,s1],s3)=[s1,s2,s2,s1]
其中,s1
,s2
,s3
是一些字符串,xs
是字符串列表
我可以使用两个助手函数is_into(xs:string list,s1:string)->bool
和remove(xs:string list,s1:string)->string list
来实现这一点,但在列表中重复两次似乎很难看
clean_list(xs: string list, s1: string) =
case (xs, s1) of
( [], _ ) => NONE
|( _, "" ) => NONE
|( _, _) => if is_into(xs, s1)
then remove(xs, s1)
else NONE
有没有一种方法可以不在列表中重复两次(一次在中进入,一次在中删除)
注:不使用任何内置功能
很抱歉,我忘记了规格中的一个重要案例
clean_list ([s1, s2, s3, s4], s10] = NONE
您的clean_list
函数不进行类型检查,因为某些分支具有type'a选项
,而其他分支具有type'b列表
假设您希望返回'b列表
,无
应替换为[]
。您可以在清除列表
上递归使用模式匹配,以避免需要辅助功能:
fun clean_list(xs: string list, s1: string) =
case (xs, s1) of
([], _) => []
| (_, "") => []
| (x::xs', _) => if x = s1
then clean_list(xs', s1)
else x::clean_list(xs', s1)
您可以轻松地一个元素一个元素地浏览列表,并删除与给定字符串匹配的所有内容,最后返回SOME lst
,其中lst
是结果列表
fun clean_list ([], _ ) = NONE
| clean_list (_, "") = NONE
| clean_list (xs, str) =
let
fun clean_list' [] = []
| clean_list' (x::xs) =
if x = str then
clean_list' xs
else
x :: clean_list' xs
in
SOME (clean_list' xs)
end
更新
我注意到上面的代码实际上没有处理这种情况:clean_list([s1,s1,s1,s1],s1)=NONE
。不过这是一个简单的修复方法
我可以看到,根据您新更新的规范,如果元素首先不在列表中,则应返回NONE
。这与以下说法相同:如果在遍历所有元素时没有删除任何元素,则返回NONE
希望您可以看到,这可以通过向helper函数添加一个额外的布尔参数来实现,首先将其设置为false,然后在每次递归调用中传递其值,除非在删除元素的情况下,在这里它始终可以设置为true
然后,可以使用该参数确定天气,以返回SOME lst
,其中lst
是结果列表,或者NONE
(如果未删除任何元素)
考虑到这两件需要修正的事情,让helper函数在累加参数中建立其结果可能是一个好主意。这样,当累加列表最后为空时,您可以完全控制并轻松返回NONE
。我忘记了规范中的一个重要案例ean_列表([s1,s2,s3,s4],s10]=NONE@sonia,您应该能够轻松地扩展提供的解决方案来处理此问题。顺便说一句,我有spottet,它(clean_list([s1,s1,s1,s1],s1)=无
)案例也没有正确处理。如果没有,那么您应该重新措辞/编辑您的问题,以反映您遇到的问题。很抱歉,我忘记了规范清理列表中的一个重要案例([s1,s2,s3,s4],s10]=无