使用具有用户定义类型的原始函数

时间:2015-02-27 03:50:36

标签: ocaml ocamlyacc

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

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

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

由于

2 个答案:

答案 0 :(得分:2)

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

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

我怀疑最好调整你的ocamlyacc代码,以便按你想要的方式工作。

答案 1 :(得分:-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)

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

相关问题