Вы удалили одну пару скобок и добавили еще две.
Скобки в (f a) :: (map_alternate g f rest)
не имеют значения.Они могут быть опущены.
Скобки в
fun map_alternate (f, g, lst) =
case lst of
[] => []
| a::b => f a :: map_alternate (g, f, lst)
на самом деле имеют значение: эта функция принимает один аргумент, 3-кортеж, шаблон соответствует каждому тремкомпоненты и, в конце концов, вызывает себя с модификацией этого 3-го кортежа (с взаимозаменяемостью 1-го и 2-го элементов).
В отличие от этого, функция
fun map_alternate f g lst =
case lst of
[] => []
| a::b => f a :: map_alternate g f rest
имеет другое значение.Это эквивалентно
val rec map_alternate = fn f => fn g => fn lst =>
case lst of
[] => []
| a::b => f a :: map_alternate g f rest
и является функцией, которая принимает аргумент f
и возвращает функцию, которая принимает аргумент g
и возвращает функцию, которая принимает аргумент lst
и возвращает case lst of ...
.То есть карри версия функции с тремя аргументами, а не с кортежем .Функции, возвращающие функции, включают в себя ->
s в сигнатуре типа.