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]=无