为什么我的代码错了?我该如何检查数字是否在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
为什么我的代码错了?我该如何检查数字是否在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
好吧,你可以看到:
# 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
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。
谢谢!这有点复杂。 –
在习惯了更高阶的函数之后,它们是该工具包中非常有用的一部分。但是你可以使用'List.mem'来解决你的问题。它像你期待的那样工作。 –
就是这样! List.mem。 –