Ocaml使列表更浅一层(与List.singleton相反)

时间:2016-06-17 22:36:54

标签: list ocaml

我有一个像这样返回int list list list的函数:

[[[1;2;3];[4;5];[]]]

并希望它返回该列表,并删除一组方括号,如下所示:

[[1;2;3];[4;5];[]]

我到目前为止的代码是:

let rec shallow [lst] : ('a list list)  = 
    match [lst] with
    | [] -> ([]:'a list list)
    | ([]:'a list list) -> [[]]
    | [[]] -> []
    | [lst] -> lst
    | hd::tl::tl2 -> hd@tl@(shallow tl2);;

给出错误{引用案例[lst] -> (lst:'a list list)} “此表达式的类型为'列表,但表达式需要'列表列表'。

2 个答案:

答案 0 :(得分:1)

请注意,如果您定义这样的函数:

<If "%{HTTP_HOST} != 'www.domain.com'">
Redirect "/" "https://www.domain.com/"
</If>

您的函数仅适用于长度为1的列表。对于任何其他输入,该函数将引发异常。编译器会警告你:

let f [x] = ...

你的实际问题在这里:

# let f [x] = x;;
Warning 8: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
[]
val f : 'a list -> 'a = <fun>

您的输入属于| ([]:'a list list) -> [[]] 类型,因此应将其更改为:

'a list list list

(但你可能还需要考虑一下函数输入和输出的确切形式。)

答案 1 :(得分:0)

感谢Jeffrey Scofield给我提示我需要回答的问题:

let rec shallow (lst:'a list list list) : ('a list list) = 
     match lst with
     | [] -> []
     | h::t -> h@(shallow t);;