我正在研究 Andrew Appel 撰写的《ML 中的现代编译器实现》的第 1 章,我决定用 OCaml 而不是 SML 来实现它。我是 OCaml 新手,遇到了一个非常令人沮丧的问题。OCaml 似乎认为下面的函数具有签名int * (int * 'a) -> 'a option。
let rec lookupTable = function
| name, (i, v) :: _ when name = i -> Some v
| name, (_, _) :: rest -> lookupTable (name, rest)
| _, [] -> None
Run Code Online (Sandbox Code Playgroud)
但据我所知,应该没有任何迹象表明元组中的第一个元素是 int。这是一个问题,因为当lookupTable函数运行时,编译器会抱怨我没有向它传递一个整数。也许我错过了一些非常明显的东西,但它非常令人难以置信。这是程序的其余部分
open Base
type id = string
type binop = Plus | Minus | Times | Div
type stm =
| …Run Code Online (Sandbox Code Playgroud)