F # составление списка пар из двух списков - PullRequest
0 голосов
/ 28 декабря 2018

Мне нужно создать функцию в F # для объединения элементов в двух списках (см. (Ii) на следующем рисунке): enter image description here На самом деле я не совсем уверен, в чем вопросВопрос: Нужно ли создавать функцию, которая принимает два списка и возвращает список пар, где i-й элемент в результирующем списке является парой, где первый элемент в паре является i-м элементом в первом списке, а второй элемент в пареi-й элемент во втором списке?Я не понимаю, что означает * в val pairlists :'a list * 'b list -> ('a * 'b)list

Если это было то, что я должен был сделать, то вот что я попробовал:

let pairlists (l : 'a list) (m : 'b list) =
    if l.Length <> m.Length then 
        failwith "the two lists does not have the same size"
    else 
        [for i in 1 .. l.Length do
            yield (l.Head,m.Head)

        ]

Я не уверенкак это сделать, так как я не знаю, как я могу перебирать списки?Помощь

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

* в сигнатуре функции означает, что вход является кортежем из двух списков, а вывод - списком кортежей.Простейший способ добиться этого - использовать функцию List.zip:

let pairlists ((a, b) : 'a list * 'b list) = 
    List.zip a b

Здесь мы определяем входной параметр как кортеж из списка a и списка b и передаем списки в List.zip : 'T1 list -> 'T2 list -> ('T1 * 'T2) list соответственно

0 голосов
/ 28 декабря 2018

Вы просматриваете списки путем сопоставления с образцом, что выполняется с помощью выражения match ... with.

Например:

f l = 
   match l with
   | head :: tail -> "This list has at least one element!"
   | _ -> "This list is empty"

> f [1]
> "This list has at least one element!"

> f [1; 2]
> "This list has at least one element!"

> f []
> "This list is empty"

В вашем случае может быть несколько возможностей: оба списка пусты, один пуст, а другой нет или оба имеют хотя бы один элемент:

pairlists l m =
    match l, m with
    | (lhead :: ltail), (mhead :: mtail) ->  // both non-empty
    | [], (mhead :: mtail) ->  // first list empty, second is not
    | (lhead :: ltail), [] ->  // second is empty, first is not
    | [], [] ->  // both are empty

Теперь все, что вам нужно сделать, это решить, каким должен быть результат функции в каждом из этих четырех случаев, а затем записать его.

Я не собираюсьдать вам полный ответ, так как это, очевидно, домашнее задание, но вот еще один совет: объединение двух непустых списков означает объединение их голов (т.е. первых элементов), затем объединение их хвостов, затем соединение этих двух вместе.

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