Итак, вот функция, которую я перевел с другого языка (Lisp), в основном дословно. Однако мне кажется, что это не совсем правильно, что с использованием ref
, if
без else
и т. д. Как бы вы переписали вторую функцию ниже?
let directEdges node edges =
List.filter (fun (a, b) -> a = node) edges
let getConnected node edges =
let visited = ref Set.empty
let rec traverse node =
if not (Set.contains node !visited) then
visited := Set.add node !visited
directEdges node edges
|> List.iter (fun (a, b) -> traverse b)
traverse node
!visited
Изменить: также не требуется, чтобы код использовал Set; оригинал просто использовал список.