2

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

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

if then else 语句是否总是必须返回一个值?

编辑:这是我正在努力的代码。我想将此函数应用于带有 map 函数的列表。该函数应该查看列表 wordlist 中的每个单词并添加到 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
4

3 回答 3

3

是的,if是 OCaml 中的表达式,而不是语句。最好的看待它的方式是 OCaml 中没有语句。一切都是一种表达。(诚​​然,有些表达式返回(),类似于语句。)

只有if b then e当类型eunit(即,如果它返回())时,您才能拥有。

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

于 2015-08-04T03:22:04.957 回答
3

如果 then 表达式的计算结果为 unit ,则只能有if thenwithout 否则,表达式将不会进行类型检查。没有 else 的 if 等同于只能键入检查 y 是否为单位的写作。else()if x then y else ()

看看这个作为参考

(术语说明:OCaml 中没有语句,因为一切都是表达式,因此术语“if 语句”不太适用。我仍然理解您的意思,但我认为这值得注意)

于 2015-08-04T03:08:52.093 回答
2

问题的一个答案let b =- 它的工作原理是这样的:

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

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

# 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.
于 2015-08-04T18:39:15.453 回答