這段代碼讀取一個目錄並將所有.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