если у вас есть функция «test ab», которая возвращает true, если a и b связаны напрямую, и если у вас есть заданный неупорядоченный список вещей, что было бы элегантным и быстрым решением для фильтрации всех связанных вещей из данного списка?
Пример:
let test a b = let diff = a - b in diff == 0 ;;
let lst = [4;1;7;3;8;9;2;0] ;;
filter_connected 2 lst ;;
-> [4;1;3;2;0]
Есть подсказки?
Хммм, постараюсь уточнить свой вопрос ...
- существует несортированный список вещей, pE. "пусть lst = [a; b; c; d; e; f; g; h] ;;" с типом
val a 'list
- существует также функция, которая определяет, являются ли две вещи связанными напрямую или, другими словами, являются ли две вещи прямыми соседями:
val тест: a '-> a' -> bool
- мне нужна функция, которая имеет три аргумента, первый - это конкретная вещь, второй - несортированный список вещей, как предложено выше, последний - тестовая функция, описанная выше:
val filter_connected: список a '-> a' -> (a '-> a' -> bool) -> a 'список
если a <-> b являются прямыми соседями, а b <-> c - прямыми соседями, то [a; b; c] связаны.
Предлагаемый «List.filter () lst» здесь не помогает, поскольку он фильтрует только направленных соседей.
В приведенном выше примере с a <-> b и b <-> c в качестве прямых соседей в случае test-функции, а все остальные нет, вызовом filter_connected будет:
"filter_connected b lst (test) ;;"
и вернется:
[А, Ь; с] * +1027 *
Надеюсь, он будет более чистым ...