【问题标题】:How to avoid SML datatype repetition in structures and signatures?如何避免结构和签名中的 SML 数据类型重复?
【发布时间】:2014-11-27 16:01:31
【问题描述】:

给定签名A,数据类型为t,比如说

signature A = sig
    datatype t = T of int | S of string
end

是否可以提供不重复t 的实现(结构)?例如,在下面的签名中,重复了t 的定义。这对于小型数据类型很好,但对于较大的数据类型有点笨拙。

structure AImpl : A = struct
    datatype t = T of int | S of string
end

我的意图只是提供一个接口,以便人们可以了解所有的声明。但我不希望每个实现都重复数据类型定义。

虽然签名和结构似乎都可以包含来自另一个结构的数据类型,但是通过单独检查签名将无法知道数据类型声明。例如:

structure AData = struct
    datatype t = T of int | S of string
end

signature A = sig
    datatype t = datatype AData.t
end

structure a : A = struct
    open AData
end

当然,如果我将ADataA 放在同一个.sig 文件中,这种方法虽然不是那么令人满意,但也是可以接受的。

【问题讨论】:

    标签: module sml algebraic-data-types


    【解决方案1】:

    不,这是不可能的,因为签名匹配规则在 sml 中是如何工作的。

    当您在签名中引入一些非抽象类型时,每个结构都带有 此签名必须提供相同的类型绑定。原因是签名 在 sml 中主要用于隐藏结构细节。

    例如,您可以使用抽象类型向结构用户隐藏数据类型详细信息:

    signature A = 
    sig
      type t
    end
    
    
    structure AImpl :> A = 
    struct
       datatype t = T of int | S of string
    end
    

    或者您可以只公开一种类型构造函数:

    signature A = 
    sig
      type t
      val T : int -> t
    end
    
    
    structure AImpl :> A = 
    struct
       datatype t = T of int | S of string
    end
    
    val test = AImpl.T 12;
    

    【讨论】:

    • 这是有道理的。签名用于隐藏实现。只是想我可以将辅助功能放在另一个(嵌套)结构中并打开它。
    猜你喜欢
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2012-05-15
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多