почему тип функции ('a ->' b) * 'a list ->' b list? - PullRequest
0 голосов
/ 11 октября 2018
fun map (f,xs) =
 xs of
 [] => []
 | x::xs’ => (f x)::(map(f,xs’))

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

Во-первых, должен ли f иметь другой тип возвращаемого значения с аргументом?

Если мы применяем f как двойную функцию (fn x => 2 * x), его типint-> int

Так что я не могу понять почему ('a ->' b) вводит в функции карты

Также fx :: map (f, xs '), я думаю, у него должен быть' a * 'список. (и true :: [1,2,3] неприемлемо, как мы знаем)

Когда мы думаем о 1 :: [2,3], то 1 - это int, а [2,3] - это int list. Поэтому я думаю, что это должен быть ('a ->' b) * 'b list -> not('a ->' b) * 'список ->' b список

1 Ответ

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

Во-первых, должен ли f иметь другой тип возвращаемого значения с аргументом?

Да, так и должно быть.Пожалуйста, представьте: применяя map к списку, мы хотим превратить каждый элемент в список.

Вот приложение: expand [1,2,3] 3 ====> [[1, 1, 1], [2, 2, 2], [3, 3, 3]].В этом случае a это int, а b это int list, понимаете?Они разного типа.

Более подробное объяснение этого случая можно найти в этом QA


Так что я думаю, что это должно быть ('a ->' b) * 'b list ->

Это не правда.('a -> 'b) * 'b list -> ???? Скажите, пожалуйста, какой у вас последний тип параметра.Независимо от того, какой последний тип, он всегда должен быть ('a -> 'b) * 'a list ... вместо ('a -> 'b) * 'b list ...


  • тип f: 'a -> 'b
  • Предположим, чтотип xs: 'x list
  • Затем тип x: 'x

Обратите внимание на это выражение: (f x), которое сообщает вам xявляется аргументом f.Таким образом, тип 'x должен быть равен типу 'a, а не 'b.

...