Из вашего описания мне кажется, что эти состояния на самом деле не являются невозможными.
Давайте начнем с вашего определения MyThing
:
type alias MyThing =
{ nodes : Dict Int String
, edges : Dict Int { from : Int, to : Int, label : String }
}
Это псевдоним типа , а не тип - это означает, что компилятор будет принимать MyThing
вместо {nodes : Dict Int String, edges : Dict Int {from : Int, to : Int, label : String}}
и наоборот.
Поэтому вместо безопасного создания значения MyThing
с использованием функций фабрики я могу написать:
import Dict
myThing = { nodes = Dict.empty, edges = Dict.fromList [(0, {from = 0, to = 1, label = "Edge 0"})] }
… и затем передайте myThing
любой из ваших функций, ожидающих MyThing
, даже если узлы, соединенные Edge 0 , не содержатся в myThing.nodes
.
Это можно исправить, изменив MyThing
на пользовательский тип:
type MyThing
= MyThing { nodes : Dict Int String
, edges : Dict Int { from : Int, to : Int, label : String }
}
… и выставив его, используя exposing (MyThing)
вместо exposing (MyThing(..))
. Таким образом, конструктор для MyThing
не предоставляется, и код вне вашего модуля должен использовать фабричные функции для получения значения.
То же самое относится к Edge
, который, как я предполагаю, определяется как :
type alias Edge =
{ from : Int, to : Int, label : String }
Если он не изменен на пользовательский тип, тривиально создать произвольные значения Edge
:
type Edge
= Edge { from : Int, to : Int, label : String }
Затем вам нужно будет открыть некоторые функции для получить Edge
значений для передачи в функции типа getNodeTexts
. Давайте предположим, что я получил MyThing
и одно из его ребер:
myThing : MyThing
-- created using factory functions
edge : Edge
-- an edge of myThing
Теперь я создаю другое значение MyThing
и передаю его getNodeTexts
вместе с edge
:
myOtherThing : MyThing
-- a different value of type MyThing
nodeTexts = getNodeTexts edge myOtherThing
Это должно вернуть Maybe.Nothing
или Result.Err String
, но определенно не (String, String)
- ребро не принадлежит myOtherThing
, поэтому нет гарантии, что его узлы содержатся в нем.