【问题标题】:How to 'RUN' Zero-Argument Function in SML如何在 SML 中“运行”零参数函数
【发布时间】:2017-04-11 19:26:26
【问题描述】:

如果有这样的函数foo

fun foo() = 10

当我想运行 foo 时,我是这样写的:

val bar = foo

但是 bar 变成了一个函数 (unit->int) 而不是 10

所以我这样尝试:

val int bar = foo

但它会出错。所以我尝试这样:

fun foo x = 10

val bar = foo 0

最后我得到 bar = 10,但它看起来很糟糕。

那么,我应该如何运行零参数函数而不改变任何东西?

【问题讨论】:

    标签: function sml


    【解决方案1】:

    您可能会想到其他一些语言,其中() 表示一个空参数列表。
    在 SML 中,它没有。

    foo 不接受零参数;它只需要一个参数:()

    - fun foo () = 10;
    val foo = fn : unit -> int
    

    如您所见,foo 是一个从unitint 的函数。

    - ();
    val it = () : unit
    

    ()(通常读作“单位”)是unit 类型的唯一值。
    (“单元”一词可以表示“单一事物”,这正是类型的含义。)

    要调用该函数,请将unit 类型的参数传递给它:

    - foo ();
    val it = 10 : int
    

    当然你也可以给()绑定一个名字:

    - val kittens = ();
    val kittens = () : unit
    - foo kittens;
    val it = 10 : int
    

    旁注:如果你比较一下,你可能会觉得这很奇怪,比如说,

    - fun bar (x,y) = x + y;
    val bar = fn : int * int -> int
    

    bar 也只接受一个参数,类型为int * int
    我们通常它需要两个,但从类型系统的角度来看,只有一个参数(这是一对)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-18
      • 1970-01-01
      • 2012-09-02
      • 2015-04-07
      • 1970-01-01
      • 2019-07-18
      相关资源
      最近更新 更多