Haskell 转换格式为“”的字符串<;num>;m<;num>;s`到'Double'代表总分钟数
在Haskell中,是否有一些标准函数将可能包含分钟和秒的字符串(即类似于此的Haskell 转换格式为“”的字符串<;num>;m<;num>;s`到'Double'代表总分钟数,haskell,time,Haskell,Time,在Haskell中,是否有一些标准函数将可能包含分钟和秒的字符串(即类似于此的34m30s)转换为相应的可能是分钟的两倍?因此,在本例中,我们将34m30s转换为仅34.5您可以使用将字符串转换为,然后将其转换为和双精度 import Data.Time parseMS :: String -> Maybe Double parseMS = fmap (realToFrac . (/ 60) . timeOfDayToTime) . parseTimeM False defaultTim
34m30s
)转换为相应的可能是分钟的两倍?因此,在本例中,我们将34m30s
转换为仅34.5
您可以使用将字符串
转换为,然后将其转换为和双精度
import Data.Time
parseMS :: String -> Maybe Double
parseMS = fmap (realToFrac . (/ 60) . timeOfDayToTime) . parseTimeM False defaultTimeLocale "%Mm%Ss"
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)
您可以使用将字符串
转换为,然后将其转换为和双精度
import Data.Time
parseMS :: String -> Maybe Double
parseMS = fmap (realToFrac . (/ 60) . timeOfDayToTime) . parseTimeM False defaultTimeLocale "%Mm%Ss"
基于parseTimeM
的答案似乎只有在分钟和秒正好是两位数时才有效,因此parseMS“1m30s”
和parseMS“12ms”
都不会产生任何结果
这里确实需要一个简单的解析器。这里有一个在列表monad中使用读取
调用的函数。请注意,它将需要一个带有“m”和“s”后缀的分秒部分,因此“10m”、“10m30”和“15s”都将不产生任何结果。此外,它将接受负数和前导空格,因此“10m-30s”
只返回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)
导入数据。可能(listToMaybe)
readMS::String->可能是双精度
readMS str=listtomabe$do
(mins,'m':rest1)基于parseTimeM
的答案似乎只有在分钟和秒正好是两位数时才起作用,因此parseMS“1m30s”和parseMS“12ms”
都不会产生任何结果
这里确实需要一个简单的解析器。这里有一个在列表monad中使用读取
调用的函数。请注意,它将需要一个带有“m”和“s”后缀的分秒部分,因此“10m”、“10m30”和“15s”都将不产生任何结果。此外,它将接受负数和前导空格,因此“10m-30s”
只返回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)
导入数据。可能(listToMaybe)
readMS::String->可能是双精度
readMS str=listtomabe$do
(mins,'m':rest1)您是否有充分的理由将时间作为一个双精度?为什么不留一个好的格式呢?可以从以下格式解析TimeOfDay
:parseTimeM False defaultTimeLocale”%Mm%Ss“34m30s”
。如果需要将其转换为单个数值,请将其转换为整数秒,而不是两倍
分钟。是否有充分的理由将时间作为双倍
来处理?为什么不留一个好的格式呢?可以从以下格式解析TimeOfDay
:parseTimeM False defaultTimeLocale”%Mm%Ss“34m30s”
。如果需要将其转换为单个数值,请将其转换为整数秒,而不是两倍的
分钟。我想我应该指出,您可以添加“警卫”/单子的条件或重新设置的理解,例如负值或秒值>=60。对于单子,你会加上:啊。。太早按回车键。对于monad,您应该向monad添加guard$mins>=0
和guard$secs>=0&&secs=0
和secs>=0&&secs我想我应该指出,您可以向monad添加“guard”/conditions或理解来重新设置,例如,负值或秒值>=60。对于单子,你会加上:啊。。太早按回车键。对于monad,您需要添加guard$mins>=0
和guard$secs>=0&&secs=0
和secs>=0&&secs>