首页 文章

(SML)将类型定义为函数并创建此类型的函数

提问于
浏览
4

这里的第一个问题,只是想作为序言,我做了几个查询,虽然我发现了多个问题类似的措辞,我发现没有人提出或回答我的问题(据我所知) .

我在SML工作,因为我要留下一些细节,所以我可以自己解决这个问题 . 我在SML中定义了以下类型:

- type Env = string -> int;

本质上,Env类型应该是一个允许从字符串映射到int的函数 - 这是一个简单的环境方案 . 创造一个能够做到这一点的功能,即:

- fun foo (s:string) = 10; (*simple example*)

但有没有办法将此函数声明为"Env type"?原因是我最终需要创建一个函数,其返回值是一个Env类型的函数,我不知道如何执行它 . 我知道SML允许类型别名,我认为这意味着技术上任何具有类型 string -> int 的函数都将与程序的Env类型同义,但我想要更明确的东西 .

如果需要澄清,请询问,我会尝试更简洁 .

3 回答

  • 1

    原因是我最终需要创建一个返回值为Env类型函数的函数,我不知道如何执行此操作 .

    使用 fun 时,可以通过在所有参数模式之后放置类型注释 : Env 来指定返回类型为 Env ;例如:

    fun fooFactory arg : Env = ...
    
  • 1

    您可以使用 val 绑定而不是 fun 声明来使SML明确地将类型与函数关联 . 这样的两步过程:

    - fun foo_temp (s:string) = 10;
    val foo_temp = fn : string -> int
    
    - val foo:Env = foo_temp;
    val foo = fn : Env
    

    或者您可以使用匿名函数:

    -val (foo:Env) = fn (s:string) => 10;
    val foo = fn : Env
    

    我不确定是否可以使用 fun 关键字直接执行此操作 . 例如,以下操作失败:

    -fun (foo:Env) (s:string) = 10;
    

    有点神秘的消息 Error: illegal function symbol in clause

    也许还有其他一些我不熟悉的解决方法

  • 2

    由于 Env 只是一个类型别名(使用 type Env = ... 而不是例如 datatype Env = ...abstype Env = ... 创建),因此创建返回 Env 的函数与创建返回字符串→int函数的函数完全相同 .

    以下是对您的问题的两种解释:

    如何创建一个返回字符串→int函数的函数?

    有几种方法,它实际上取决于它应该做什么 . 但是一些例子可能是:

    val zero_env = fn s => 0
    fun update_env env t x = fn s => if s = t then x else env s
    fun add_env env t x = fn s => env s + (if s = t then x else 0)
    

    我如何确保类型签名明确说明......→Env而不是... string→int?

    • 使用 datatype Env = ...
    datatype Env = Env of string -> int
    fun unEnv (Env f) = f
    val zero_env = Env (fn s => 0)
    fun update_env env t x = Env (fn s => if s = t then x else (unEnv env) s)
    fun add_env env t x = Env (fn s => (unEnv env) s + (if s = t then x else 0))
    
    • 使用 abstype Env = ...
    abstype Env = Env of string -> int
    with
        (* ... same as e.g. type Env = ..., except now the Env type is opaque ... *)
    end
    
    • 使用模块:
    signature ENV =
    sig
        type Env
        val zero_env : Env
        val update_env : Env -> string -> int -> Env
        val add_env : Env -> string -> int -> Env
        ...
    end
    
    structure FunctionalEnv : ENV =
    struct
        (* ... same as e.g. type Env = ..., except now the Env type is opaque ... *)
    end
    

相关问题