当前,我的代码接收一个字符串s
和一个字符串列表sl
,并返回一个字符串列表,其中s
被删除(一次)
fun all_except_option (s, sl) =
case sl of
[] => []
| hd::tl = if same_string(s, hd)
then tl
else hd::all_except_option(s, tl)
但是,如果字符串NONE
不在列表中,我想返回s
,如果字符串,则返回SOME (
当前函数的输出)
。但是,我不能简单地在SOME(
之前添加hd::all_except_option(s, tl)
,因为hd
将附加到输出选项的内容上,我不知道该怎么做。
编辑:谢谢大家!
答案 0 :(得分:1)
听起来您需要一个新功能:
fun some_option(s,sl) = SOME( all_except_option(s, sl) )
嗯,不完全是,因为它不能处理all_except_option
返回[]
的情况,但我将保留它作为练习。
答案 1 :(得分:1)
fun all_except_option (s, ss) =
case ss of
[] => NONE
| s'::ss' =>
if s = s' then SOME ss' else
case all_except_option (s, ss') of
NONE => NONE
| SOME ss'' => SOME (s'::ss')
请注意,这只会删除s
的第一个匹配项,它会反映您的版本。
您也可以使用Option.map
来避免出现嵌套的情况:
fun all_except_option (s, ss) =
case ss of
[] => NONE
| s'::ss' =>
if s = s' then SOME ss'
else Option.map (fn ss' => s'::ss') (all_except_option (s, ss'))
答案 2 :(得分:0)
您可以使用
case all_except_option(s, tl) of ...
匹配两种不同的情况并以适当的方式处理每种情况。
答案 3 :(得分:0)
安德烈亚斯·罗斯伯格(Andreas Rossberg)提供了两个完整的例子。
这是一个变体,其中模式匹配位于函数的参数中:
fun curry f x y = f (x, y)
fun all_except_option (s, []) = NONE
| all_except_option (s, t::ts) =
if s = t
then SOME ts
else Option.map (curry op:: t) (all_except_option (s, ts))
其中curry op:: t
是要获取列表并将t
放在其前面的函数:
- curry op:: "x" ["y", "z"];
> val it = ["x", "y", "z"] : string list
等效于fn ss' => t::ss'
。