2012-04-25 68 views
1

我想构建一个解析器,它可以接收地图输入并输出一个Case类。现在我有一些似乎没有利用FP的命令式样代码。我只是看不到如何构建可输出Case类的解析器。斯卡拉地图解析器

以下是我有:

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但随着解析器组合的东西。上述问题是不灵活或可重用的。来电者必须拿取他们所得到的。

我希望解析器组合器将是在地图表单中解析结果的正确方法。正如你可能猜到的,我正在与DyanmoDB合作。

UPDATE 2: 显然我不能很好地解释这个问题。我想要做的就是编写一个或多个Pareser Combinator,它可以使用调用者指定的绑定将Map转换为调用者选择的Case类。输入地图=>输出案例类

更新3: https://github.com/wfaler/scala-dynamo看起来很有趣,但不使用解析器组合。

+0

这是用于DynamoDB的吗? – Nick 2012-04-25 15:03:12

+0

是。我试图将发电机结果绑定到案例类。 – dres 2012-04-25 18:23:47

+0

我不明白你的更新。什么是你的输入值,你最终想要得到什么? – sschaef 2012-04-25 18:29:29

回答

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) 
} 

应用程序的更多示例可以发现here

+0

我需要避免scalaz,但看到我的更新以上关于解析器组合。这只是一个让它工作的功能。我不认为这是一个好设计。 – dres 2012-04-25 18:25:09

3

与@ 4e6类似的问题,但只有使用Scala内置方法才能实现:

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

一旦尝试过,我对斯卡拉留下了深刻的印象,并且随着时间的推移,它开始思考有时会忘记核心Scala函数:) – 4e6 2012-04-25 09:25:52

+0

这会返回一个'Option'。这很好,你应该提到它。 – ziggystar 2012-04-25 11:55:05

+0

我需要避免scalaz,但看到我的更新以上有关Parser Combinators。这只是一个让它工作的功能。我不认为这是一个好设计。 – dres 2012-04-25 18:24:50