Подходящий в Окамле - PullRequest
       10

Подходящий в Окамле

0 голосов
/ 10 сентября 2018

Я выполнял задание для своего класса, где я должен сложить все элементы в списке. Я был озадачен тем, как это сделать, поскольку мне сказали, что вы не можете получить доступ к отдельным элементам в списке, как, например, в Python.

Я обнаружил, как большинство людей делает это, используя что-то вроде следующего

let rec list_sum lst =
    match lst with
    | [] -> 0
    | hd :: tl -> hd + list_sum tl

Мой вопрос: откуда берутся hd и tl? Люди, которые написали код, никогда не предопределяли эти переменные или что-то в этом роде, поэтому вы можете просто написать их так? Откуда они знают, о каком списке вы говорите?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Мой вопрос: откуда берутся hd и tl? Люди, которые написали код, никогда не предопределяли эти переменные или что-то в этом роде, поэтому вы можете просто написать их так?

Переменные объявляются с использованием их в шаблоне. Код с таким же успехом мог бы быть

let rec list_sum lst =
    match lst with
    | [] -> 0
    | fred :: ethel -> fred + list_sum ethel

Откуда они знают, о каком списке вы говорите?

Код объявляет функцию с именем list_sum, которая принимает параметр с именем lst. Когда вы используете функцию, вы предоставляете аргумент для этого параметра, который указывает, о каком списке вы «говорите», например:

let some_numbers = [ 2; 3; 4; 5 ]
let the_sum = list_sum some_numbers
0 голосов
/ 10 сентября 2018

В шаблоне hd :: tl вводятся имена hd и tl.По сути, это одна из целей шаблона.Для присвоения имен частям соответствующего значения.

Когда вы говорите match v with pattern ..., шаблон сопоставляется со значением v.В этом коде шаблоны сопоставляются со значением lst.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...