2015-10-22 5 views
2

Я пытаюсь создать функцию, которая имеет тип:Функция, которая принимает тип блок

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

Но мне было интересно, блок пустой тип (не имеет значения), так как это было бы возможно что-то сделать с ним и вернуть 3 списка int?

Благодаря

ответ

4

unit Типа не пусто.
У него есть одно значение, которое написано () и обычно называется «единицей», как и его тип.
(Одно из значений слова «единица» является «одной вещи».)

Пример:

-(); 
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 
+0

Да, Синтаксис '()' немного вводит в заблуждение, поскольку это фактическое значение. –

2

В SML типа unit часто представляет собой выходное воздействие или, в более общем-то, что включает в себя побочные эффекты ввода /. Несколько реалистичным примером функции того типа, который вы ищете, будет тот, который возвращает 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 

типичный "прогон" 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 
Смежные вопросы