2013-12-08 3 views
7

私は今夜F#とredisで遊んでいます。私はServiceStack.redisを使って、localhost上で走っているMSOpenTech redisに接続しています。私はこのようなコードでのRedisにビットコインの価格を保存しようとしていたテスト目的のために:F#でのServiceStack.Redisがデータを格納していません。しかし、C#のほぼ同じコードが動作します

let redis = new RedisClient("localhost") 
redis.FlushAll() 

let redisBitstamp = redis.As<BitstampLast>() 
let last = {Id = redisBitstamp.GetNextSequence(); Timestamp = 1386459953; Value=714.33M} 
redisBitstamp.Store(last) 

let allValues = redisBitstamp.GetAll() 
allValues.PrintDump() 

残念ながら、PrintDumpからの結果は以下のとおりであった:

[ 
    { 
      __type: "Program+BitstampLast, RedisSave", 
      Id: 0, 
      Timestamp: 0, 
      Value: 0 
    } 
] 

ただ、テスト目的のために、私はほぼ同じ走りました同じRedisのインスタンス上のC#のコード:

class BitstampLast 
{ 
    public Int64 Id { get; set; } 
    public int Timestamp { get; set; } 
    public decimal Value { get; set; } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var redis = new RedisClient("localhost"); 
     redis.FlushAll(); 

     var redisBitstamp = redis.As<BitstampLast>(); 
     var last = new BitstampLast() {Id = redisBitstamp.GetNextSequence(), Timestamp = 1386459953, Value=714.33M}; 
     redisBitstamp.Store(last); 

     var allValues = redisBitstamp.GetAll(); 
     allValues.PrintDump(); 

    } 
} 

そして結果...

[ 
    { 
      __type: "CSharpRedis.BitstampLast, CSharpRedis", 
      Id: 1, 
      Timestamp: 1386459953, 
      Value: 714.33 
    } 
] 

だから私は何が欠けていますか?なぜC#で動作し、F#では動作しませんか?それはする必要があるため、間違っている

type BitstampLast = {Id:int64; Timestamp:int; Value:decimal} 

EDIT: BitstampLastは、そのように定義されて

type BitstampLast = {mutable Id:int64; mutable Timestamp:int; mutable Value:decimal} 

をそして今、それが動作します。次の質問 - なぜそれは変更可能でなければならないのですか?このオブジェクトは赤く塗られていますか?

+2

F#プロジェクトでBitstampLastをどのように定義しましたか? –

+0

これは偉大なヒントでした。私はいくつかのブログでそれを見たので、変更可能に変更されました。私はより多くを学ぶことが大好きだ、なぜこれを可変に設定する必要があります。説明のための – mlusiak

答えて

14

F#の不変レコードは、デフォルトではありませんServiceStackのライブラリ(e.g.Serialization、オートマッピングなど)POCOのデフォルトコンストラクタと書き込み可能な性質を持っている上で動作し、多くの。

F#でPOCOのを作る最良の方法は、C#コードでアクセス可能なすべてのプロパティのためのパブリックgetterとsetterを持つPOCO型を作成しますCLIMutable属性F# 3.0 Language Featureとそれを飾るが、それでもF#、例えばのように不変の型を振る舞うことです:

[<CLIMutable>] 
type BitstampLast = { Id:int64; Timestamp:int; Value:decimal } 
+0

ありがとう!そしてServiceStack :) – mlusiak

+0

@mlusiak npを持つすべての偉大な仕事のためのおかげで:-) – mythz

関連する問題