带类型单位的函数

Function that takes type unit

我正在尝试创建一个具有以下类型的函数:

unit -> (int list * int list * int list)

但我想知道,unit 是一个空类型(没有值),所以怎么可能用它和 return 3 int 列表做点什么?

谢谢

类型unit不为空。
它有一个拼写为 () 的值,通常称为 "unit",就像它的类型一样。
("unit" 这个词的一个意思是 "a single thing"。)

示例:

- ();
val it = () : unit
- val you_knit = ();
val you_knit = () : unit

- fun foo () = ([1], [2], [3]);
val foo = fn : unit -> int list * int list * int list
- foo ();
val it = ([1],[2],[3]) : int list * int list * int list
- foo you_knit;
val it = ([1],[2],[3]) : int list * int list * int list

(注意 () 不是空参数列表;ML 没有参数列表。)

严格来说,上述定义模式匹配值()
如果没有模式匹配,它可能看起来像这样:

- fun bar (x : unit) = ([1], [2], [3]);
val bar = fn : unit -> int list * int list * int list
- bar ();
val it = ([1],[2],[3]) : int list * int list * int list

在 SML 中,类型 unit 通常代表一个 input/output 动作,或者更笼统地说是一些涉及副作用的东西。您正在寻找的那种函数的一个比较现实的例子是 returns 3 个随机生成的列表。另一个例子是从标准输入中提取数字,例如:

open TextIO

fun split s = String.tokens (fn c => c = #",") s

fun toInt s = valOf (Int.fromString s)

fun toIntList line = map toInt (split line)

fun getInts prompt = 
    ( 
       print prompt;
       case inputLine(stdIn) of
           SOME line => toIntList line |
           NONE => []
     )

fun getLists() = 
     let
         val prompt = "Enter integers, separated by a comma: "
     in
         (getInts prompt, getInts prompt, getInts prompt)
     end

getLists的类型是

val getLists = fn : unit -> int list * int list * int list

典型的 "run" of getLists:

- getLists();
Enter integers, separated by a comma: 1,2,3
Enter integers, separated by a comma: 4,5,6
Enter integers, separated by a comma: 7,8,9
val it = ([1,2,3],[4,5,6],[7,8,9]) : int list * int list * int list