2

Lift で記述されたコードがいくつかあります。基本的に入れ子になった Box (Option と同様のモナド) です。できればもう少しシンプルにしたい。できれば型パラメータを追加して、必要に応じて簡単に string または double に変更できるようにします。ここにコードがあります

tryo(r.param("boolean parameter").map(_.toBoolean)).map(_.openOr(false)).openOr(false)

"tryo" は、例外が発生し、r が Req オブジェクトの場合に結果をキャッチして Box にラップするヘルパー関数です。"param" 関数は Box[String] (リクエスト パラメータから取得) を返します。Int の String などで機能するようにしたいと思います。可能であれば、ネストされた map/openOr (getOrElse は Option 型と考えてください) を取り除きます。

モナドトランスフォーマー?

4

3 に答える 3

6

flatMapそのたわごと!

r.param("boolean parameter").flatMap(tryo(_.toBoolean)).openOr(false)

または、理解のために a を使用します。

val result = for {
  param <- r.param("boolean parameter")
  bool <- tryo(param.toBoolean)
} yield bool
result openOr false

しかし、それはさまざまなタイプを取得する能力を解決しません。そのために、私は次のようなことを提案します:

def asOrDefault[T](input: Box[Any])(default: => T): T = input.flatMap(tryo(_.asInstanceOf[T])).openOr(default)

asOrDefault(r.param("any param"))(0)

これはテストされていません... return a と同じように an を返すことにも注意してscala.util.control.Exception.allCatch.opt()ください。OptiontryoBox

于 2012-08-20T13:52:13.797 に答える
3

型を抽象化する場合は、デフォルト値と文字列からの変換の両方を抽象化する必要があります。

case class Converter[T]( default: T, fromString: String => T )

次に、型の暗黙的なインスタンスを定義します。

implicit val intConverter = Converter[Int]( 0, _.toInt )
implicit val boolConverter = Converter[Boolean]( false, _.toBoolean )

最後に、暗黙的に提供されたコンバーターの値を使用して、pr1001 の回答を使用します。

def asOrDefault[T](input: Box[String])(implicit conv: Converter[T]): T = input.flatMap(
  s => tryo( conv.fromString(s))).openOr(conv.default)

コンパイラは適切なコンバータ インスタンスを選択します。

asOrDefault[Int]( input.param("some int param") )
asOrDefault[Boolean]( input.param("some boolean param") )
于 2012-08-20T15:09:22.897 に答える
0

@pr1001 と @paradigmatic に基づいて少し調整したバージョン。

case class Converter[T]( fromString: String => T )

implicit val boolConverter = Converter(_.toBoolean) 

implicit val intConverter = Converter(_.toInt)

def asOrDefault[T](input: Box[String], default: T)(implicit conv: Converter[T]): T =       
  input.flatMap( s => tryo(conv.fromString(s))).openOr(default)

私の場合の使用法:

def prettyPrint(implicit r: Req) = asOrDefault(r.param("prettyPrint"), false)

def maxResults(implicit r: Req): Int = asOrDefault(r.param("maxResults"), 20)
于 2012-08-21T14:10:07.263 に答える