情報集合論(仮名) 型の設計
//情報
type Info<'a, 'b, 'c>
(
f : 'a -> bool, //フィルター関数
m : 'a -> 'b, //マッピング関数
parentGetDataFunc : ( List<'c> -> List<'a> ) option //親の関数
) =
//フィールド
let _filter = f
let _map = m
let mutable parentFunc = parentGetDataFunc
member private this.Filter with get() = _filter
member private this.Map with get() = _map
member private this.PrentFunc with get() = parentFunc
//親を考慮してデータを取得する
static member (=>)( data : List<'c>, x : Info<'a, 'b, 'c> ) : List<'b> =
let newData = x.PrentFunc.Value( data )
newData => x
//親を考慮しないでデータを取得する
static member (=>)( data : List<'a>, x : Info<'a, 'b, 'c> ) : List<'b> =
data
|> List.filter x.Filter
|> List.map x.Map
type Data( name : string, value : obj ) =
//フィールド
let _name = name
let _value = value
//プロパティ
member this.Name with get() = _name
member this.Value with get() = _value
//メソッド
override this.ToString() = _name + ":" + value.ToString()
[<EntryPoint>]
let main argv =
//テストデータを準備
let source =
[
yield "実験データ" :> obj
for i in 1..10 -> ( "正数", i :> obj ) :> obj
for i in -10..-1 -> ( "負数", i :> obj ) :> obj
yield "終了" :> obj
]
printfn "元のデータ"
let f ( x : obj ) = printf "%s " <| x.ToString()
List.iter <| f <| source
printfn "\n"
//人間が認識する情報(情報集合)には必ず名前が必要
let filter ( x : obj ) =
match x with
| :? ( string * obj) as s -> ( fst s ).Length > 0
|_ -> false
let map ( x : obj ) =
let name, value = x :?> ( string * obj )
new Data( name, value )
let humanSet = new Info<obj, Data, Unit>( filter, map, None )
let data = source => humanSet
printfn "%s" "情報集合"
let f ( x : Data ) = printf "%s " <| x.ToString()
List.iter <| f <| data
printfn "\n"
//終了
0
名前も付けられないようなごみデータはふるい落とすということです。F#はもともと型システムがあるのでちょっと婉曲的な表現になりました。このプログラムで表したのは、フィルター条件の設定です。フィルターは必ず1つ以上の情報を除去するものでなくてはなりません。そうしないと、条件を付ける意味がありません。すなわち、必ず親集合の濃度は子集合の濃度よりも高くなります。これにより集合理論のパラドックスを防ぎます。
しかしながら、集合論のパラドックスの解決法を明確に示すには、べき演算の性質を考える必要があります。分かっていることをいちいち示すのは骨が折れますが、自分の理論を検証するためにやるしかない。