Неисправность конкатенации результатов функции - PullRequest
0 голосов
/ 01 июня 2018

Мой профессор предлагает нам внедрять декартовы произведения в F #.Он предоставляет нам тип для использования:

type SET =
   | I of int list                                  // I [1;2;3]
   | S of string list                               // S ["a";"b";"c"]
   | IS of (int * string) list                      // IS [(1, "a");(2, "b")]
   | II of (int * int) list                         // II [(1,2); (3,4); (5,6)]
   | SS of (string * string) list                   // SS [("a","b"); ("c","d")]
   | SI of (string * int) list                      // SI [("a", 1); ("b", 2); ("c", 3)]
   | SISI of ((string * int) * (string * int)) list // SISI [(("a", 1), ("b", 2)); (("c", 3), "d", 4))]
   | SIIS of ((string * int) * (int * string)) list // SIIS [(("a", 1), (2, "b")); (("c", 3), (4, "d"))]

При этом нам также предоставляется функция 'product', которая ведет себя следующим образом:

let product s1 s2 =
  match (s1, s2) with
    | (I s1, I s2) -> II (pairs s1 s2)
    | (S s1, S s2) -> SS (pairs s1 s2)
    | (I s1, S s2) -> IS (pairs s1 s2)
    | (S s1, I s2) -> SI (pairs s1 s2)
    | (SI s1, IS s2) -> SIIS (pairs s1 s2)
    | (SI s1, SI s2) -> SISI (pairs s1 s2)

Назначение:создайте функцию 'pair', которая собирает декартово произведение элементов SET.Нам сказали начать с создания функции, которая может распределять значения по списку.Я сделал это здесь:

let rec dist a L =
    match L with
    | [] -> []
    | h::t -> (a,h) :: dist a t

Пока моя функция выглядит следующим образом:

let rec pairs s1 s2 = 
    match s1 with
    | [] -> []
    | h::t -> dist h s2 // AND (pairs t s2)

Я не понимаю, как мне нужно изменить последнюю строку выражения соответствиячтобы правильно отражать результат, который мы желаем.Это завершит часть функции успешно, но только первый бит (в связи с тем, что заголовок списка распределяется, но не хвост).Как можно объединить результаты первого цикла этой функции на голове s1 с 'pair t s2', чтобы элементы, созданные в первом сегменте, соответствовали второму так, чтобы предотвратить столкновение ожидаемых типов?

1 Ответ

0 голосов
/ 01 июня 2018

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

let rec pairs s1 s2 = 
    match s1 with
    | [] -> []
    | h::t -> (dist h s2) @ (pairs t s2)

Я ранее пробовал всю мою конкатенацию с оператором ::, но это неправильнотип оператора для этой операции.

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