0

我在 ocamlyacc 中遇到问题,我的起点类型与我所有规则的返回类型不匹配(我在一个点返回一个字符串,在另一个点返回一个字符串列表 -> 字符串提升),所以我做了一种新类型:

type S = 
    | StringFun of (string list -> string list)
    | String of string;;

所以我可以将入口点的类型设置为那个来停止我得到的错误(我不知道是否有更好的方法来做到这一点?),但这意味着现在当我想连接两个字符串时SI 型不能只使用 ^。有没有办法做到这一点?

谢谢

4

2 回答 2

2

如果您只想连接String变量的值,则以下函数可能非常好:

let concat a b =
    match a, b with
    | String sa, String sb -> String (sa ^ sb)
    | _ -> failwith "invalid argument: concat"

我怀疑最好调整您的 ocamlyacc 代码,以便它以您想要的方式工作,但是。

于 2015-02-27T04:33:15.377 回答
-1

也许像

let append_s a b = match a, b with
  | StringFun f, StringFun g -> StringFun (fun xs -> g (f xs))
  | StringFun f, String s -> StringFun (fun xs -> f (s::xs))
  | String s, StringFun f -> StringFun (fun xs -> s::f xs)
  | String x, String y -> String (x ^ y)

这对我来说看起来不太好。也许你可以重新设计一些东西,这样就不需要这种奇怪的连接了。

于 2015-02-27T04:42:44.280 回答