F#は実存型をサポートしていません。だから私は自分の考えを表現する別の方法を探しています。F#で存在型を表現する
私はデータ構造を持っており、その内容はさまざまな方法で解釈できます。この特定の例では、私はそれがintまたは実数とみなすことができると仮定します:real
が何か意味がある
type Packed = (* something sensible *) unit
type PackedType = | PackedInt
| PackedReal
let undefined<'a> : 'a = failwith "undefined"
let unpackInt : Packed -> int = undefined
let unpackReal : Packed -> real = undefined
let packInt : int -> Packed = undefined
let packReal : real -> Packed = undefined
は、言う:
type real = int * int
let addReal : real -> real -> real = undefined
は今、私は機能addPacked : PackedType -> Packed -> Packed -> Packed
を必要としています。私はそれが一般的になりたい、それは次のようになります。
type NumberOp = [forall t] { opPack : 't -> Packed; opUnpack : Packed -> 't; opAdd : 't -> 't -> 't }
let getNumberOp (t : PackedType) =
match t with
| PackedInt -> { opPack = packInt; opUnpack = unpackInt; opAdd = (+) }
| PackedReal -> { opPack = packReal; opUnpack = unpackReal; opAdd = addReal }
let addPacked (t : PackedType) (a : Packed) (b : Packed) =
let { opPack = pack; opUnpack = unpack; opAdd = add } = getNumberOp t
pack <| add (unpack a) (unpack b)
は、ここで私は
NumberOp
がexistetialことになってしまいました。だから私はこれを表現する別の方法があるかどうか尋ねています。
Packed
、
[un]pack*
の機能と
addPacked
のタイプを変更することはできません。
私はthis答えを見つけました。それは "よく知られているパターン"があると述べていますが、テキストは読みにくく、動作させることができませんでした。一般的に
も参照してください。http://stackoverflow.com/questions/15690053/impredicative-polymorphism-in-f –