标准ML中是否有可能重新导出作为函数参数接收的结构的一部分的数据类型的构造函数。某些代码可能会使这更容易理解:如何从标准ML中的函数参数中重新导出数据类型标准ML
signature FLAG =
sig
type t
end
signature MEMBER =
sig
structure Flag : FLAG
end
functor Member(F : FLAG) : MEMBER =
struct
structure Flag = F
end
structure M =
Member(struct
datatype t =
FLAG_1
| FLAG_2
end)
val flag1 = M.Flag.FLAG_1;
(* Error: unbound variable or constructor: FLAG_1 in path M.Flag.FLAG_1 *)
上面的例子可以不作任何形式的实际意义,但它是我在我的一个项目中遇到的问题,只是一个淡化的版本。
感谢。你是完全正确的。我对自己的项目感到厌倦,错过了在签名中未指定类型时发生的事实。在我的具体情况中,我有两个不同的'FLAG'结构,有两个不同的'datatype'声明,所以我不能真正定义一个签名。再次感谢。 –
我想(希望!)你的情况应该能够实现!也许正确使用'where'? SML模块系统是我已经接触到的最令人兴奋的PL构造之一,但是经常和在许多方面,我感觉有局限性并遇到障碍,使得它明确表示模块系统不是我想要的。我仍然试图确定哪些部分是语言实施所强加的限制,哪些部分是良构和逻辑正确性的严格限制。 –
我能够通过使用一种我称之为mixin模式的模式来解决这个问题,我只是简单地'打开'functor'调用的结果。 https://gist.github.com/igstan/c566eecc38784216f1499bfe8d91f4c4 –