Есть ли разница между fn: ('a ->' b) * ('a ->' b) * 'a list ->' b list и fn: ('a ->' b) -> ('a -> 'b) ->' список -> 'b список - PullRequest
0 голосов
/ 07 октября 2018

Я написал функцию

fun map_alternate (f,g,lst) =
    case lst of
        []   => []
      | a::b => f a ::  map_alternate (g, f, lst)

и ее тип:

 ('a -> 'b) * ('a -> 'b) * 'a list -> 'b list

Но когда я изменил круглые скобки, как это

fun map_alternate f g lst =
    case lst of
         []   => []
       | a::b => (f a) :: (map_alternate g f rest)

, он выдает другой тип:

fn : ('a -> 'b) -> ('a -> 'b) -> 'a list -> 'b list

Так что же отличается?

1 Ответ

0 голосов
/ 08 октября 2018

Вы удалили одну пару скобок и добавили еще две.

Скобки в (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 в сигнатуре типа.

...