Haskell 转换格式为“”的字符串<;num>;m<;num>;s`到'Double'代表总分钟数

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

在Haskell中,是否有一些标准函数将可能包含分钟和秒的字符串(即类似于此的
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>