Я хочу объявить график всех состояний, где ребра представляют смежные состояния.Я думаю, что то, что я пытаюсь сделать, может быть названо «завязывание узла» (хотя я не уверен в этом).Это не работает, как я ожидал, и у меня есть пара вопросов.
Во-первых, я хочу, чтобы тип State имел строковое имя и список смежных состояний.Но это объявление выдает ошибку компилятора "... немедленная циклическая ссылка ...":
type State = string * (State list)
Этот способ работает:
type State(name:string, contigs: (State list)) =
let name = name
let contigs = contigs
Но на самом деле это не обязательно называть членов,Кортеж в порядке.Как я могу заставить этот краткий синтаксис работать?
Во-вторых, следующий код пытается объявить, что должно быть тремя графами смежных состояний (HI и AK - это графы, состоящие из одного узла, все остальные состояния составляют последнееграфик), за которым следует список всех узлов.(Для краткости я здесь фактически объявил лишь несколько состояний):
let rec hi = State("hi", [])
and mo = State("mo", [il ia])
and il = State("il", [mo])
and ia = State("ia", [mo])
and states = [hi,mo,il,ia]
Это приводит к множеству ошибок, хотя в том числе "mo в конечном итоге будет оцениваться как часть его собственного определения" и "выражение былоожидается, что будет иметь тип 'a ->' b, но здесь имеет тип State ".Я думал, что ключевые слова 'rec' и 'и' позволят этому работать.Могу ли я определить этот самоссылающийся граф?Если да, то как?