这段代码读取一个目录并将所有.ini文件名放入列表中。然后它通过读取每个文件的列表,解析它,并将解析的结果和文件名放置在一个映射(Key = filename,contents = parsed result - Config)中。我的问题是,我怎样才能得到这条线rslt <- parseFromFile parseIni fn
以适应getIni
的类型签名? parseFromFile
的类型签名monad m => m (Maybe Config)
不适合。或者有人可能会建议一种更好的编码方式吗?我只在这里包含了相关代码。有问题的功能是main
和getIni
。冲突类型签名
import System.FilePath.Glob (globDir, compile)
import Control.Monad.IO.Class
import Data.Map (Map)
import qualified Data.Map as M
import Data.ByteString (ByteString)
import Control.Applicative
import Text.Trifecta
fPath = "c:/users/tyrone/myprojects/chp29"
type FileName = String
type Name = String
type Value = String
type Assignments = Map Name Value
newtype Header = Header String deriving (Eq, Ord, Show)
data Section = Section Header Assignments deriving (Eq, Show)
newtype Config = Config (Map Header Assignments) deriving (Eq, Show)
parseIni :: Parser Config
parseIni = do
sections <- some parseSection
let mapOfSections = foldr rollup M.empty sections
return $ Config mapOfSections
getIni :: FileName -> Map FileName Config -> Map FileName Config
getIni fn mp = do
rslt <- parseFromFile parseIni fn
case rslt of
Nothing -> M.empty
Just confg -> do let ky = tail $ dropWhile (/= '\\') fn
M.insert ky confg mp
main :: IO()
main = do
iniF <- (concat . fst) <$> globDir [compile "*.ini"] fPath
print $ foldr getIni M.empty iniF
谢谢你。我用foldM替换了foldr,改变了参数并输入了一些签名,并且都很好。没有看过你的替代解决方案,但会尽快完成。 – user1897830