に、に分と秒を(すなわち、この34m30s
のようなもの)含まれている可能性があり、文字列を変換するためにいくつかの標準的な機能があり、その適切なMaybe Double
?この場合、34m30s
をJust 34.5
に変換します。変換する文字列 `<num>メートル<num> S``たぶんDouble`表現合計分Haskellで
答えて
答えは分と秒は2桁なので、parseMS "1m30s"
とparseMS "12m0s"
両方がNothing
を得た場合にのみ動作するようです。
本当に単純なパーサーが必要です。リストモナドでreads
コールを使用するものがあります。 "m"と "s"の接尾辞が付いた分と秒の部分が必要なので、 "10m"と "10m30"と "15s"はすべてNothing
となります。また、負の数と先頭の空白を受け入れるので、" 10m -30s"
はJust 9.5
を返します。
readMS1 :: String -> Maybe Double
readMS1 str = listToMaybe
[ fromIntegral (mins :: Int) + fromIntegral (secs :: Int)/60
| (mins, 'm':rest1) <- reads str
, (secs, "s") <- reads rest1
]
説明のノート、あなたが前にこのスタイルを見ていない場合:私たちは」一部の人々はそうのように、それは同等のリストの内包表記を使用して書かれているとき、これを簡単に理解するために見つける
import Data.Maybe (listToMaybe)
readMS :: String -> Maybe Double
readMS str = listToMaybe $ do
(mins, 'm':rest1) <- reads str
(secs, "s") <- reads rest1
return (fromIntegral (mins :: Int) + fromIntegral (secs :: Int)/60)
リストのモナドを使用して、それぞれのreads
呼び出しは、可能な構文のリストを(value,rest_of_string)
のペアとして返します。 doブロックの最初の行は、文字「m」と文字列のrest1
を足した整数mins
の各解析を取得します。 2番目の行は、rest1
の各可能な構文解析を、整数「secs
」とそれに続く文字「s」とそれ以外は何も得ません。
一致が失敗した場合(たとえば、文字列の最後に「s」がない場合)、モナド/理解は空のリストを返します。それ以外の場合は、すべての可能な解析から計算されたDoublesのリストを返します(この場合、最大でも1つあります)。 listToMaybe
関数は、空のリストをNothing
に変え、他のリストの先頭をつかんで一意の答えを得ます。
私はモナドに「警備員」の条件を追加することができますか、または負の値または秒の値> = 60を拒否するように理解することができると指摘しておきたいと思います。モナドの場合は、 –
Ugh .. hit Enter早すぎる。モナドの場合、適切な場所に 'guard $ mins> = 0'と 'guard $ secs> = 0 && secs <= 59'を追加します。リストの理解では、 "mins> = 0'と' secs> = 0 && secs <= 59'節を "guard"を書かずに書くだけです。 –
その後、DiffTime
とDouble
に変換し、TimeOfDay
にString
を変換するData.Time.Format.parseTimeM
を使用することができます。 parseTimeM
に基づい
import Data.Time
parseMS :: String -> Maybe Double
parseMS = fmap (realToFrac . (/ 60) . timeOfDayToTime) . parseTimeM False defaultTimeLocale "%Mm%Ss"
- 1. 文字列を置換する正規表現 "<" and ">"
- 2. 正規表現内の部分置換/削除文字
- 3. のJava 8の変換リスト<地図<文字列、文字列>マップする<文字列、地図<文字列、文字列>>
- 4. C++ベクトルを変換する<pair <double、double >> to double *、double *?
- 5. double *を配列に変換する方法<double>(6)
- 6. 文字列をdoubleに変換する、
- 7. double numberをC++の(IEEE 754)64ビットバイナリ文字列表現に変換する
- 8. "\ s @ \ s"という文字列をキャプチャする正規表現
- 9. 文字列をArrayListに変換<Character>、正規表現なし
- 10. <固定文字列><変数文字列><固定文字列>の正規表現ですか?
- 11. 正規表現の結果を置換文字列
- 12. Haskellの文字列を文字列に変換する
- 13. 数字と特定の単語を文字列に一致させる正規表現を書くにはどうすればよいですか?次の文字列にマッチする</p> <pre><code>^\s*(\d+(\s*,\s*\d+)*)?\s*$ </code></pre> <p>:
- 14. のJavaのHashMapに区切り文字で一覧<String>変換<文字列、文字列>
- 15. Double変換のByteString表現
- 16. htmlspecialcharsをエスケープ文字に変換する正規表現
- 17. 文字列の配列をリストに変換する<string>
- 18. Java:部分文字列を<b>部分文字列で置換する</b>大文字と小文字を区別しない
- 19. この<em>は正規表現</em>また、文字列から
- 20. 辞書<文字列、辞書<文字列、文字列>>をデータテーブルに変換
- 21. バイナリ表現を計算する - 文字列をバイナリデータに変換する
- 22. 文字列をjava.util.Streamに変換する<Character>
- 23. 文字列をC++で文字列をdoubleに変換する方法
- 24. 変換文字列以下の入力</p> <p>入力変換するためのPythonを
- 25. <char>を変換のある文字列に変換する
- 26. JavaScript正規表現マスタ文字列からdouble qoutesにある部分文字列を抽出する式
- 27. リストを変換する<boolean>を文字列に
- 28. Eigen :: SparseMatrix <double>をdeal.ii :: SparseMatrix <double>に変換しますか?
- 29. 文字列をarraylistに変換する<Character> in java
- 30. doubleをint型に変換した文字列に変換する
「ダブル」として時間を操作するのはよい理由はありますか?それを良いフォーマットで残してみませんか? ['time'](https://hackage.haskell.org/package/time-1.7)はあなたの書式から' TimeOfDay'を解析できます: 'parseTimeM False defaultTimeLocale"%Mm%Ss "" 34m30s "' – Alec
数値を1つの数値に変換する必要がある場合は、分の秒数ではなく、秒数に変換します。 – chepner