다음은 내 예제 코드입니다. 나는 State
합계 유형을 재귀 적 으로 만드는 방법을 알아낼 수 없었지만 여전히 다른 곳에서 합계 유형처럼 사용할 수 있도록 허용했습니다. 내 StateMachine
타입도 마찬가지입니다 .
let State =
< Task : { Comment : Text, Resource : Text, End : Bool }
| Map : { Comment : Text, Iterator : StateMachine }
| Parallel : { Comment : Text, Branch : List State }
>
let StateMachine
: Type
= { Comment : Optional Text
, StartAt : Text
, States : List { mapKey : Text, mapValue : State }
}
let test
: StateMachine
= { Comment = Some "A simple minimal example"
, StartAt = "Hello World"
, States =
[ { mapKey = "Hello World"
, mapValue =
State.Task { Type = "Task", Resource = "Test", End = True }
}
]
}
in test
코드 크기를 늘리지 않고 최종 사용자가 가져오고 사용할 수 있도록 유형을 인체 공학적으로 만들지 않는 합리적인 방법이 있습니까? 예제에서 명확하지 않은 경우 상태 머신을 모드 화하려고합니다.
다음을 시도했지만 "Not a record or a Union"오류가 발생합니다 State.Task
.
let State
: Type
= ∀(_State : Type)
→ ∀(Task : { Type : Text, Resource : Text, End : Bool })
→ ∀(Map : { Type : Text, Iterator : _State })
→ _Stat
첫째, 당신이 말하려는 유형은 다음과 같습니다.
let State
: Type
= ∀(State : Type) →
∀(Task : { Type : Text, Resource : Text, End : Bool } → State) →
∀(Map : { Type : Text, Iterator : State } → State) →
State
in State
질문에 답하기 위해 재귀 공용체 유형에 가장 가까운 것은 다음과 같은 표현입니다.
let State
: Type
= ∀(State : Type) →
( < Task : { Type : Text, Resource : Text, End : Bool }
| Map : { Type : Text, Iterator : State }
> →
State
) →
State
in State
...하지만 무료로 공용체 생성자를 얻지 못할 것이므로 어쨌든 후자의 표현을 사용하지 않는 것이 좋습니다.
두 가지 방법 모두 생성자와 동일한 방식으로 작동하는 함수를 만들어야합니다. 비재 귀적 공용체 유형 에서처럼 언어가 생성하지 않습니다.
사용을 권장하는 표현이므로 첫 번째 유형에 대한 생성자를 작성하는 방법을 설명하겠습니다.
let Types =
let Task = { Type : Text, Resource : Text, End : Bool }
let Map = λ(State : Type) → { Type : Text, Iterator : State }
let State
: Type
= ∀(State : Type) →
∀(Task : Task → State) →
∀(Map : Map State → State) →
State
in { Task, Map, State }
let -- Record of constructors similar to what you would get from a union type
State =
let Task
: Types.Task → Types.State
= λ(x : Types.Task) →
λ(State : Type) →
λ(Task : Types.Task → State) →
λ(Map : Types.Map State → State) →
Task x
let Map
: Types.Map Types.State → Types.State
= λ(x : Types.Map Types.State) →
λ(State : Type) →
λ(Task : Types.Task → State) →
λ(Map : Types.Map State → State) →
Map (x with Iterator = x.Iterator State Task Map)
in { Task, Map }
in State.Map
{ Type = "Foo"
, Iterator = State.Task { Type = "Bar", Resource = "CPU", End = False }
}
자세한 내용은 다음을 참조하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다