2016-08-17 4 views
0

2つの文字列をダブルに変換して比較する慣用方法を探していますか?ダブルに変換した後の文字列と比較するには?

def toDouble(s: String): Option[Double] = { 
    try { s.toDouble } catch { case _ => None } 
} 

だから私は2倍を比較するために、発現のためにやっている:

for { 
    d1 <- toDouble(s1) 
    d2 <- toDouble(s2) 
} yield (d1 > d2) 

は、今私は(d1 < d2)をやってみたかったと言う、可能性が安全に私が持っている倍増に変換し

私は何とかこれを一般化していますか?

このクリーナーを改善するための改善点はありますか?

+0

は何ですか。 intダブルスのうちの一方または両方が「なし」の時に終了した結果?存在しないものをどう比較することができますか? – Eric

+0

@Eric私はただNoneを返すだけで、呼び出し側のコードがそれを処理します。 –

答えて

2
import scala.util.Try 

    def f(x: String, 
      y: String, 
      compare: (Double, Double) => Boolean): Option[Boolean] = for { 
     a <- Try { x.toDouble }.toOption 
     b <- Try { y.toDouble }.toOption 
    } yield compare(a, b) 

scala> f("42", "66", _ < _) 
res0: Option[Boolean] = Some(true) 

scala> f("42", "66", _ > _) 
res1: Option[Boolean] = Some(false) 

私はBooleanより良いタイプを好むので、私の答えに改善の余地があります。

+0

ブール値に問題がありますか? –

+2

'' Conor McBrideはブール値を利用するために、その起源を知る必要がありますので、その意味を知ることができます。 " - source:https://existentialtype.wordpress.com/2011/03/15/ブーリアン・ブラインド/ –

+0

素敵なFPの歌詞を私に落として...あなたはハード・コアのFPです:) –

1

"toDouble"はStringLikeから入手でき、Doubleに変換できないものを変換しようとすると、参照するNumberFormatExceptionがスローされます。それを使うだけの "慣用的"なのですが、scala.utilでラップして試してみてください。

ことを示すことになるFailure(java.lang.NumberFormatException: For input string: "hi")ようになりますトライ結果(一方で、どれも問題が起こったの呼び出し元に、意味的に示すものではありませんんので、より多くの慣用的な(かつ簡単に、より良い)になる代わりにオプションで試してみてください戻る。

それだけで次の手順を実行する方が簡単であるとして最後に、私はこの1つ上のために/収量をスキップします:

import scala.util.Try 

Try(s1.toDouble < s2.toDouble) 

ケビン・メレディスの答えは、高階関数を作成することで一般化する方法を示して

関連する問題