вом обращении создается другая функция,
Сипу). Когда эта функция применяется к последовательности аргументов, при пер вом обращении создается другая функция, которая затем применяется ко второму аргументу.
Функция min_c берет один целочисленный аргумент и создает новую функцию, также с одним аргументом:
min_c 4 = if 4 < у then 4 else у
Эта функция может затем применяться к другому одиночному аргументу:
min_c 4 5 =
(if 4 < у then 4 else у) 5 =
if 4 < 5 then 4 else 5 =
if true then 4 else 5 =
4
Карризованные функции могут использоваться в частичных вычислениях для определения новых функций:
fun min_4 = min_c 4
min_4 5 =
(if 4 < у then 4 else y) 5 =
if 4 < 5 then 4 else 5 =
if true then 4 else 5 =
4
16.3. Составные типы
Списки
Список можно создать из элементов любого предварительно определенного типа, в частности из встроенных типов, например целого или булева. Следующие списки:
[2,3,5,7,11 ] [true, false, false]
имеют типы int list и bool list, соответственно. Список можно создать также с помощью конструкторов (constructors); конструкторы списка — это [] для пустого списка, и element::list для непустого списка, создаваемого добавлением элемента (element) к существующему списку (list). Конструкторы могут использоваться при определении функций путем сопоставления с образцом:
fun member [] e = false
| member [e :: tail] e = true
j member [e1 :: tail] e = member tail e
Тип функции member (член) определяется как:
member: int list x jnt -> boolean
и это можно прочитать следующим образом:
Когда функция member применяется к списку L, а (затем) к элементу е, вычисление основывается на вариантах выбора в зависимости от аргументов: 1) если L пуст, е не является членом L; 2) если е — первый элемент L, то е является членом L; 3) в противном случае, е1, первый элемент списка L, отличен от е, и мы (рекурсивно) проверяем, является ли е членом оставшейся части списка L.