このビットはディレクトリを読み取り、すべての.iniファイル名をリストに入れます。次に、各ファイルを読み込んで解析し、解析結果とファイル名をマップに配置します(Key = filename、contents = parsed result-Config)。私の質問は、rslt <- parseFromFile parseIni fn
をタイプシグネチャgetIni
に適合させるにはどうすればいいですか? parseFromFile
はタイプシグネチャmonad m => m (Maybe Config)
であり、適合しません。また、誰かがより良いコーディング方法を提案できますか?私はrelaventコードのみをここに含めた。問題の機能は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
ありがとう。私はfoldrをfoldMに置き換え、パラメータを変更してシグネチャをビットで回してみました。あなたの代わりの解決策を見ていないが、できるだけ早くそうするだろう。 – user1897830