2012-04-25 3 views
1

私はマップ入力を受け取り、ケースクラスを出力できるパーサーを構築したいと思います。今、私はFPを利用していないような命令的なスタイルのコードをいくつか持っています。私は、Caseクラスを出力できるParserを構築する方法を知ることはできません。ここでスカラマップパーサー

は私が持っているものです。

def fromMap(m: Map[String,AttributeValue]): User = { 
    val id = m.get("user-id") map {_.getS} 
    val email = m.get("email").get.getS 
    val name = m.get("name").get.getS 
    val openId = m.get("openId") map {_.getS} 
    User(id, email, name, openId) 
} 

UPDATE: 私は私がAnormに似ていますが、Scalaではパーサコンビネータで何かをしたいと考えていることがより明確になっている必要がありますね。上記の問題は、柔軟性がなく、再利用できないということです。呼び出し元は、取得したものだけを取得する必要があります。

私は、パーサーコンビネータがマップフォームの結果を解析するための正しいアプローチになることを期待しています。あなたが推測したように私はDyanmoDBと一緒に働いています。

更新2: 明らかに私は問題をよく説明できません。私がしたいのは、呼び出し側が指定したバインディングを使用して、呼び出し側が選択したCaseクラスにマップを変換できる1つまたは複数のPareser Combinatorsを書くことだけです。入力マップは=>出力ケースクラス

UPDATE 3: https://github.com/wfaler/scala-dynamoは面白そうだが、パーサコンビネータを使用していません。

+0

これはDynamoDB用ですか? – Nick

+0

ダイナモの結果をケースクラスに結びつけようとしています。 – dres

+0

更新内容がわかりません。あなたの入力値は何ですか?最後に何を得たいですか? – sschaef

答えて

1

私はscalazApplicativeBuilderと思っています。また、例外を回避する方法として、Optionを返すことが好ましいgetSがあるかわからないので、あなたのスニペットの簡易版は、次のようになります。

case class User(val id: String, val email: String, val name: String, val OpenId: String) 

def fromMap(m: Map[String, String]): Option[User] = { 
    val id = m.get("user-id") 
    val email = m.get("email") 
    val name = m.get("name") 
    val openId = m.get("openId") 
    id |@| email |@| name |@| openId apply User 
} 

は混乱を避けるために、ApplicationBuilderapply方法は、実際に関数を受け取り、その詳細なバージョンが

(id |@| email |@| name |@| openId) { (id, email, name, openId) => 
    new User(id, email, name, openId) 
} 

ですapplicativesのより多くの例は、@ 4E6にhere

+0

私はscalazを避ける必要がありますが、上記のParser Combinatorsについての更新を見てください。これは機能させるためだけの機能でした。私はそれが良いデザインだとは思わない。 – dres

3

同様の答えを見つけましたが、内蔵された方法Scalasのみで実現することができます。

case class User(id: String, email: String, name: String, openId: String) 

val m = Map("user-id" -> "123", "email" -> "[email protected]", "name" -> "testuser", "openId" -> "456") 

def fromMap(m: Map[String, String]): Option[User] = for { 
    id <- m get "user-id" 
    email <- m get "email" 
    name <- m get "name" 
    openId <- m get "openId" 
} yield User(id, email, name, openId) 

scala> fromMap(m) 
res0: Option[User] = Some(User(123,[email protected],testuser,456)) 
+0

一度試してみましたが、私はスカラズにとても感心しています。時にはコアのスカラ関数について時々忘れていると思うようになりました。 – 4e6

+0

これは 'Option'を返します。それは良いことです、あなたはそれに言及すべきです。 – ziggystar

+0

私はscalazを避ける必要がありますが、上記のParser Combinatorsについての更新を見てください。これは機能させるためだけの機能でした。私はそれが良いデザインだとは思わない。 – dres