2016-09-27 64 views
0

为什么我的代码错了?我该如何检查数字是否在OCaml的列表中?

# let ls = [1;2];;

VAL LS:INT列表= [1; 2]

# let inList a l = List.exists a l;;

VAL INLIST:( '一个 - >布尔) - >' 列表 - > BOOL =

# inList 1 ls;;

错误:此表达式具有int类型但一个表达 'a - > bool

回答

1

好吧,你可以看到:

# let inList a l = List.exists a l;; 

val inList : ('a -> bool) -> 'a list -> bool

所以a'a -> bool类型,这意味着a是列表中的每个元素的谓词。

你想写什么

let inList a l = List.mem a l

val inList : 'a -> 'a list -> bool

TL; DR RTFM ;-) http://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html

+0

就是这样! List.mem。 –

1

List.exists的第一个参数是一个函数,如果元素是您正在查找的元素,则返回true,否则返回false。你正在提供int 1,这不是一个函数。

你需要一个功能looking_for这样的:

let inList a l = 
    let looking_for x = ... in 
    List.exists looking_for l 

功能looking_for应该如果x是你要找的内容(即,如果它等于a),否则为false返回true。

+0

谢谢!这有点复杂。 –

+0

在习惯了更高阶的函数之后,它们是该工具包中非常有用的一部分。但是你可以使用'List.mem'来解决你的问题。它像你期待的那样工作。 –