let rec some_none list =
match list with
| [] -> list
| hd::tl ->
if hd = 0 then
[None] @ some_none tl
else
[Some hd] @ some_none tl;;
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时它返回
Error: This expression has type int list but an expression was expected of type
'a option list
Type int is not compatible with type 'a option
Run Code Online (Sandbox Code Playgroud)
我怎样才能将常规更改a' list为a' option list?
这两行
match list with
| [] -> list
Run Code Online (Sandbox Code Playgroud)
暗示返回的列表与其some_none参数具有相同的类型。将该行更改为
| [] -> []
Run Code Online (Sandbox Code Playgroud)
解决了这个问题,因为左侧和右侧现在不相关了。一种更微妙的方法(在这里并不是很有用)是使用构造as,
match list with
| [] -> list
Run Code Online (Sandbox Code Playgroud)
因为... as x构造捕获模式的类型而不是审查者的类型(此处列出)。然而,这种结构对于多态变体最有用。
另请注意,您的函数some_none既不会更改列表的长度,也不会更改列表元素的顺序。这意味着它可以写成地图:
let some_none = List.map (fun elt -> ... )
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
343 次 |
| 最近记录: |