Haskell 联合数据。映射IO中的单例
我正在努力将Haskell 联合数据。映射IO中的单例,haskell,Haskell,我正在努力将Data.Map.unions应用到Data.Map单件列表中,这些单件包装在IO中。这是我的密码: {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveFunctor #-} {-# LANGUAGE DeriveAnyClass #-} module Main where import Data.Maybe import qualified Data.Map as M import
Data.Map.unions
应用到Data.Map
单件列表中,这些单件包装在IO
中。这是我的密码:
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveAnyClass #-}
module Main where
import Data.Maybe
import qualified Data.Map as M
import qualified Data.Aeson as JSON
import GHC.Generics (Generic)
import Data.Text.Lazy (unpack)
import Data.Text.Lazy.Builder (toLazyText)
import Data.Aeson.Text (encodeToTextBuilder)
import System.IO
import System.Directory
import qualified Data.ByteString.Lazy as B
import Data.Map.Internal.Debug (showTree)
data RoseTree a = RoseTree { value :: a, children :: [RoseTree a]}
deriving (Show, Generic, Functor, JSON.FromJSON, JSON.ToJSON)
type Structure = RoseTree Int
type StructureList = [Structure]
type StructureMap = M.Map String Structure
dataDir :: FilePath
dataDir = "data"
v2s :: JSON.Value -> String
v2s = unpack . toLazyText . encodeToTextBuilder
saveToFile :: FilePath -> Structure -> IO ()
saveToFile dir structure = withFile ( dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json") WriteMode $ \h -> System.IO.hPutStr h (v2s $ JSON.toJSON structure)
loadFromFile :: JSON.FromJSON a => FilePath -> IO a
loadFromFile filename = fmap (fromJust . JSON.decode) $ B.readFile ( dataDir ++ "/" ++ filename )
loadStructuresFromFilesystem :: IO StructureMap
loadStructuresFromFilesystem = do
dirs <- listDirectory dataDir
singletons <- map (\dir -> do
structure <- ((loadFromFile (dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json")) :: IO Structure)
return $ M.singleton dir structure) dirs
return $ M.unions singletons
testStructure1 :: Structure
testStructure1 = RoseTree 1 [RoseTree 2 [], RoseTree 3 []]
testStructure2 :: Structure
testStructure2 = RoseTree 2 [RoseTree 4 [], RoseTree 6 []]
main :: IO ()
main = do
saveToFile "struct1" testStructure1
saveToFile "struct2" testStructure2
structureMap <- loadStructuresFromFilesystem
putStrLn $ showTree structureMap
{-#派生通用语言}
{-#语言派生函子#-}
{-#语言派生类{-}
模块主要在哪里
导入数据,也许吧
导入符合条件的数据。映射为M
将限定数据.Aeson作为JSON导入
进口GHC.仿制药(仿制药)
导入Data.Text.Lazy(解包)
导入Data.Text.Lazy.Builder(toLazyText)
导入Data.Aeson.Text(encodeToTextBuilder)
导入系统.IO
导入系统目录
将限定数据.ByteString.Lazy作为B导入
导入Data.Map.Internal.Debug(showTree)
数据RoseTree a=RoseTree{value::a,子项::[RoseTree a]}
派生(Show、Generic、Functor、JSON.FromJSON、JSON.ToJSON)
类型结构=RoseTree Int
类型StructureList=[Structure]
类型StructureMap=M。映射字符串结构
dataDir::FilePath
dataDir=“数据”
v2s::JSON.Value->String
v2s=打开包装。toLazyText。编码文本生成器
saveToFile::文件路径->结构->IO()
saveToFile dir structure=withFile(dataDir++“/”+++dir++“/”+++dir++“.json”)WriteMode$\h->System.IO.hPutStr h(v2s$json.toJSON结构)
loadFromFile::JSON.FromJSON a=>FilePath->IO a
loadFromFile filename=fmap(fromJust.JSON.decode)$B.readFile(dataDir++“/”++filename)
loadStructuresFromFilesystem::IO结构映射
loadStructuresFromFilesystem=do
dirslambda表达式:
\dir -> do
structure <- ((loadFromFile (dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json")) :: IO Structure)
return $ M.singleton dir structure)
我们可以通过在IO[M.Map[Char]结构上的函子映射进一步简化表达式。
我们得到:
loadStructuresFromFilesystem :: IO StructureMap
loadStructuresFromFilesystem = do
dirs <- listDirectory dataDir
M.unions <$> mapM (\dir -> do
structure <- ((loadFromFile (dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json")) :: IO Structure)
return $ M.singleton dir structure
) dirs
loadStructuresFromFilesystem::IO StructureMap
loadStructuresFromFilesystem=do
是的
结构lambda表达:
\dir -> do
structure <- ((loadFromFile (dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json")) :: IO Structure)
return $ M.singleton dir structure)
我们可以通过在IO[M.Map[Char]结构上的函子映射进一步简化表达式。
我们得到:
loadStructuresFromFilesystem :: IO StructureMap
loadStructuresFromFilesystem = do
dirs <- listDirectory dataDir
M.unions <$> mapM (\dir -> do
structure <- ((loadFromFile (dataDir ++ "/" ++ dir ++ "/" ++ dir ++ ".json")) :: IO Structure)
return $ M.singleton dir structure
) dirs
loadStructuresFromFilesystem::IO StructureMap
loadStructuresFromFilesystem=do
是的
结构singletonssingletons通常,我建议在mapM
上使用traverse
,因为traverse
更一般。但是是的,这是正确的方法。一般来说,我建议在mapM
上使用traverse
,因为traverse
更为通用。但是,这是正确的方法。