Что такое a в списке a в примере длины?

Мне интересно, где я могу найти информацию о "a", используемом в примере длины. Вроде типаж какой-то?


person doobdargent    schedule 07.07.2015    source источник


Ответы (2)


[1,2,3] — это List Int, функции, которые могут работать только со списками целых чисел, должны иметь List Int в сигнатуре своего типа. ["a", "b"] — это List String, функции, которые могут работать только со списками строк, должны иметь List String в сигнатуре своего типа. Функция, работающая со списком любого типа (например, List.length), может иметь сигнатуру универсального типа (например, List a или List b). Значение a имеет значение только в сигнатуре типа. Например, функция с типом List a -> a при задании List Int вернет Int. При задании List String он вернет String.

Возьмем, к примеру, функцию map, которая имеет подпись (a -> b) -> List a -> List b. В нем говорится, что функция, которая принимает a и возвращает b и List a, возвращает List b.

Учитывая функцию, которая принимает String и возвращает Int, а List String, map вернет List Int.

List.map String.length ["a", "aa", "aaa"]
-- [1, 2, 3] : List Int

Учитывая функцию, которая принимает Int и возвращает String, а List Int, map возвращает List String.

List.map (\n -> String.repeat n "a") [1, 2, 3]
-- ["a", "aa", "aaa"] : List String
person robertjlooby    schedule 07.07.2015
comment
Спасибо, теперь понял. - person doobdargent; 07.07.2015

a — это переменная типа.

Это означает, что тип List является полиморфным (универсальным), т. е. a может быть заменен любым типом (Int, String, ...). Функция length тоже полиморфна. Например, length [1, 2, 3] вернет 3, length ["word1", "word2"] вернет 2.

person ZhekaKozlov    schedule 07.07.2015
comment
Я не уверен, что понимаю, я не вижу полиморфизма типов, о котором вы говорите. Учитывая ваш пример, длина [1,2,3] или длина [слово1, слово2], для каждого вызова он получает список в качестве входных данных и выводит целое число. - person Mihai Cicu; 07.07.2015
comment
Но a не определен, верно? Если я заменю a на b или c или что-то еще, это тоже сработает. Это сбивает с толку! - person doobdargent; 07.07.2015
comment
@doobdargent Существует простое правило, позволяющее отличить переменные типа от типов (List Int против List a): имена типов должны начинаться с заглавной буквы, имена переменных типов должны начинаться со строчной буквы. - person ZhekaKozlov; 07.07.2015
comment
@MihaiCicu Он не может получить List, потому что List не является типом (на самом деле это конструктор типа, но это более сложная вещь). т.е. нельзя объявить функцию типа List -> Int (она не скомпилируется). - person ZhekaKozlov; 07.07.2015
comment
с объяснением robertjlooby, теперь я понимаю, что ты имел в виду. Спасибо, в любом случае - person Mihai Cicu; 10.07.2015