2016-08-30 15 views
0

私はScalaを学んでいる間にFPの旅を始めます。スカラの状態を処理する不変の方法

フィルタリングされていないWebアプリケーションでは、List[String]を維持する必要があります。 POST要求がエンドポイントに送信されると、リストはファイルから更新されます。 GET要求が同じエンドポイントに送信されると、リストが使用されます。

今、私はvarをリストの保存に使用しないようにしています。私はときどきvarを使う必要があることを知っていますが、好奇心をそそるのは、その事件に対処するエレガントな方法です。私はscalaz.State IteratorとSteamを使ってみました。しかし、私は現在の不変状態を次の要求にどのように渡すかわからないので、立ち往生しました。何か提案してください。

def update = State(l => { 
    retrieve(filepath) match { 
    case Success(lines) => (lines.split("[,\n\r]").toVector.map (_.trim), true) 
    case Failure(_) => { 
     log.error(s"Cannot retrieve the file.") 
     (l, false) 
    } 
    } 
}) 

def isContained(message: String) = State(l => (l, l.exists(message.contains))) 

/* assume the following get or post method will be invoked when GET or POST request is sent to the endpoint */ 

def post() = update(Vector.empty) // how can I pass the updated state to the get method 

def get(msg: String): Boolean = isContained(msg)(???)._2 

それから私は私がvarを使用せずに入力として、次の訪問に現在の状態を渡すことができるのか分かりません。

答えて

0

無料のランチはありません。もしあなたが可変性を避け、どこかに状態を保存しないようにするには、返された値で作業する必要があります。

Stateはendresult

は、だからあなたの場合には、モデルは次のように見ていることになるさAが初期状態とBある機能A => B(私はそれを目的のビットを単純化し)、以上のものではありません

def post(newMessage: String, state: List[String]): List[String] = { 
    newMessage :: state 
} 

def get(msg: String, state: List[String]): Boolean = { 
    state.contains(msg) 
} 

このように、現在の状態はすべてpostgetに設定する必要があります。投稿はファイルから新しいメッセージを追加するだけです(ここにビジネスロジックを置いてください)、新しい状態を返します。 getの場合は、現在の状態を提供して、必要なものを取得する必要があります。 あなたはそれをこのように書き換えることができます。

def post(newMessage: String): List[String] ⇒ List[String] = state ⇒ { 
    newMessage :: state 
} 

def get(msg: String): List[String] ⇒ Boolean = 
    _.contains(msg) 

お知らせリターンを投稿します正確A ⇒ AA = List[String])。

ScalaZ Stateは、理解のための内部機能を連鎖だけでなく、いくつかの追加の便利のためにあなたにモナドを与える(のようなmapgetsput等。)。しかし、本質的には、基本的なモデルは同じです。

は、このコードは、より正確Stateが何を表しています。これは、状態を組み合わせることが、あなたが本当にこれを必要とすることを確認していない、初期値を提供し、いつでも好きなときに、それを「実行」することができます

type YourListState = List[String] ⇒ List[String] 

    def post(newMessage: String, state: YourListState): YourListState = li ⇒ { 
    newMessage :: state(li) 
    } 

    def get(msg: String, state: YourListState): List[String] ⇒ Boolean = { 
    state(_).contains(msg) 
    } 

関連する問題