Мой профессор предлагает нам внедрять декартовы произведения в 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', чтобы элементы, созданные в первом сегменте, соответствовали второму так, чтобы предотвратить столкновение ожидаемых типов?