런타임시 대신 컴파일 타임에 평등을 검사 할 수 있도록 F #의 유형으로 자연수를 인코딩하려고했습니다. 내가 생각해 낼 수있는 최선은F #의 자연수의 유형 레벨 인코딩
type Nat<'T> =
abstract member AsInt : int
type Z() =
interface Nat<Z> with
member __.AsInt = 0
type S<'P>(prev : Nat<'P>) =
interface Nat<S<'P>> with
member __.AsInt = 1 + prev.AsInt
type TNat =
static member zero = Z() :> Nat<Z>
static member succ (prev : Nat<'P>) = S(prev) :> Nat<S<'P>>
static member one = TNat.succ(TNat.zero)
static member two = TNat.succ(TNat.one)
코드에 만족하는지 잘 모르겠습니다. 내가 간과하는 더 나은 (또는 더 쉬운) 방법으로 행해질 수 있습니까?
컴파일시에 AsInt
을 계산할 수 있습니까? 코드에서
F # 형식 시스템을 사용하면 약간의 수준 수준 프로그래밍을 수행 할 수 있지만 그다지 많지는 않습니다. 따라서이 방법을 제대로 사용할 수 없다고 생각합니다. 이 작업을 수행하려는 컨텍스트가 무엇입니까? –
부분 결과를 결합하는 기능을 사용하여 일련의 값 중 n 번째 순간을 계산하는 기능을 만들려고했습니다. 컴파일 시간에 다른 순간을 결합 할 수 없다는 것을 확인하는 것은 깔끔할 것입니다. 계산 된 순간은 컴파일 타임에 고정되고 높은 순간은 거의 필요하지 않습니다. 그 외에 호기심 :-) –
실제로는 꽤 흥미로운 사용 사례처럼 들립니다. 문법이 훨씬 더 예쁘지는 않겠지 만, 당신이 가지고있는 것과 함께 일할 수 있다고 생각합니다. 유형 공급자를 작성할 수도 있습니다. 예 : 'Moment <3>'- 유형 시스템도 늘어나지 만 조금 더 좋을 수도 있습니다. http://www.mindscapehq.com/blog/index.php/2011/09/19/f-type-providers-as-if-by-magic/ –