在Haskell中,有没有可能包含分钟和秒(即,像这样34m30s
)将字符串转换一些标准功能,它的分钟适当的Maybe Double
?所以在这种情况下,我们会将34m30s
转换为Just 34.5
。转换格式的字符串`<num>米<num> s`到`也许Double`占总分
回答
基于parseTimeM
的答案似乎只有在分秒恰好为两个数字,所以parseMS "1m30s"
和parseMS "12m0s"
都产生Nothing
工作。
你真的需要一个简单的解析器。这是一个在List monad中使用reads
调用的调用。请注意,它将需要分钟和秒部分的“m”和“s”后缀,因此“10m”和“10m30”和“15s”都将产生Nothing
。此外,它将接受负数和前导空格,因此" 10m -30s"
返回Just 9.5
。
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)
有些人觉得这个更容易理解,当它写使用等效列表理解,就像这样:
readMS1 :: String -> Maybe Double
readMS1 str = listToMaybe
[ fromIntegral (mins :: Int) + fromIntegral (secs :: Int)/60
| (mins, 'm':rest1) <- reads str
, (secs, "s") <- reads rest1
]
的说明解释,如果你以前没有见过这种风格:我们”重新使用List monad,并且每个reads
调用都会返回一个可能的解析列表,如(value,rest_of_string)
对。 do-block的第一行获取每个可能的解析整数mins
后跟字母“m”加上字符串的rest1
。第二行将rest1
的每个可能的解析结果作为整数secs
,后跟字母“s”,而不是其他任何东西。
如果匹配失败(例如,字符串末尾没有“s”),monad/comprehension将返回空列表。否则,它会从所有可能的语法结果中返回一个计算的双精度清单(在这种情况下,最多只有一个)。 listToMaybe
函数将空列表变成Nothing
,并抓住任何其他列表的头部以获得唯一的答案。
我想我应该指出,你可以添加“守卫”/条件的单子或理解refuset,例如,负值或秒值> = 60.单子,你会添加: –
呃..击回车太早了。对于monad,你应该在适当的地方添加'guard $ mins> = 0'和'guard $ secs> = 0 && secs <= 59'。在列表理解中,你只写'mins> = 0'和'secs> = 0 && secs <= 59'从句,而不写“守护”。 –
您可以使用Data.Time.Format.parseTimeM
来String
转换为TimeOfDay
,然后将其转换为DiffTime
和Double
。
import Data.Time
parseMS :: String -> Maybe Double
parseMS = fmap (realToFrac . (/ 60) . timeOfDayToTime) . parseTimeM False defaultTimeLocale "%Mm%Ss"
- 1. 无法隐式转换 'System.Collections.Generic.Dictionary <字符串,System.Collections.Generic.List <string>>' 到 '系统... <字符串,字符串>'
- 2. C++将vector <pair <double,double >>转换为double *,double *?
- 3. 将字符串转换成字符 '<' 来比较字符<
- 4. 从字符串“<fetch version ='1.0'><entity na”转换为键入'Double'无效。“
- 5. Java的转换{字符串,字符串} []地图<字符串,字符串[]>
- 6. 转换词典<字符串,字符串>到XML
- 7. vector <double>正被转换为向量<double,allocator <double>>
- 8. C#:字典的转换<字符串,字符串>到词典<字符串,字典<字符串,字符串>>
- 9. 如何将“Double”转换为VBScript中的格式化字符串
- 10. 无法隐式转换类型“System.Collections.Generic.List <string[]>”到“字符串[]”
- 11. 无法隐式转换类型“字符串”到“System.Collections.Generic.List <string>
- 12. to_string vs强制转换为字符串,而运算符<<
- 13. 将字符串转换为<S3Uri>
- 14. 转换列表<double>到0到100正态分布
- 15. 更改列表的显示格式<KeyValuePair <字符串,字符串>>
- 16. 转换复杂对象字典<字符串,字符串>
- 17. 将字典<字符串,字符串>转换为数组
- 18. 将两个矢量<double>转换成矢量<complex <double>>
- 19. 转换字符串“><" Into "><a href="tel:number">number</a><”
- 20. 转换列表转换成地图<字符串,地图<字符串,整数>> java8流
- 21. Erlang:将TCP发送的字符串转换为正确的格式,例如<<“SomeString”>>到“SomeString”?
- 22. wp_editor总是转换<br>到<p> </p>
- 23. 将字典<对象,字符串>转换为字典<字符串,字符串>
- 24. 在c#中将字典转换为字典中的字符串<字符串,字典<string,int>>?
- 25. 特定字符串格式正则表达式<><><>
- 26. LINQ - 转弯列表<string>到词典<字符串,字符串>
- 27. 将不带分隔符的字符串转换为Double/CLLocationDegrees
- 28. 的Java oneliner到字符串转换为HashSet的<Character>
- 29. 转换的LinkedHashMap <字符串,MyClass的>到Java对象
- 30. 如何将字典<字符串,对象>转换为字典<字符串,字典<字符串,字符串>>>
您是否有充分的理由将时间操作为“双倍”?为什么不把它放在一个很好的格式? ['time'](https://hackage.haskell.org/package/time-1.7)可以从你的格式解析'TimeOfDay':'parseTimeM False defaultTimeLocale“%Mm%Ss”“34m30s”'。 – Alec
如果您需要将其转换为单个数值,请转换为整数秒,而不是“双倍”分钟。 – chepner