Ocaml if-then-else语法错误

时间:2015-08-04 03:05:30

标签: if-statement ocaml ocamllex

为什么这个Ocaml语句给我一个语法错误?

let a = 0;; if a = 0 then let b = 0;;

如果then else语句总是必须返回一个值吗?

编辑:这是我正在努力的代码。我想在带有map函数的列表中应用此函数。该函数应该查看列表wo​​rdlist中的每个单词并添加到stringmap。如果已将其添加到字符串映射中,则将1添加到其密码中。

module StringMap = Map.Make(String)
let wordcount = StringMap.empty
let findword testword =
    let wordcount = (if (StringMap.mem testword wordcount) 
    then (StringMap.add testword ((StringMap.find testword wordcount)+1) wordcount)
    else (StringMap.add testword 1 wordcount))
List.map findword wordlist

3 个答案:

答案 0 :(得分:3)

如果then表达式求值为单位if then,则只能有else而不是()否则,表达式将不会键入check。没有else的if等同于写if x then y else (),只能输入检查y是否为单位。

检查一下reference

(术语说明:OCaml中没有任何陈述,因为一切都是表达式,所以术语“if语句”并不完全适用。我仍然明白你的意思,但我认为这值得注意)

答案 1 :(得分:3)

是的,if是OCaml中的表达式,而不是声明。查看它的最佳方式是OCaml中没有语句。一切都是表达。 (不可否认,有些表达式返回(),与陈述类似。)

如果if b then e的类型为e(即,如果它返回unit),则您只能()

另请注意,您不能只说let v = e,除非在模块的顶层。在顶层,它在模块中定义了一个全局名称。在其他情况下,您需要说let v = e1 in e2; let定义了一个本地符号v,用于表达式e2

答案 2 :(得分:2)

let b =问题的一个答案 - 它的工作原理如下:

let a = 0
let b = if a = 0 then 0 else 1
         (* or whatever value you need in the else branch *)

然后是Map问题:手册说Map是适用的 - 这意味着Stringmap.add返回一个新的地图。您必须使用ref来存储您的地图 - 请参阅此ocaml toplevel协议:

# module StringMap = Map.Make(String);;

# let mymap = ref StringMap.empty ;;
val mymap : '_a StringMap.t ref = {contents = <abstr>}

# mymap := StringMap.add "high" 1 !mymap;;
- : unit = ()

# StringMap.mem "high" !mymap;;
- : bool = true
# StringMap.mem "nono" !mymap;;
- : bool = false

# StringMap.find "high" !mymap;;
- : int = 1
# StringMap.find "nono" !mymap;;
Exception: Not_found.