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
是的

结构
singletons
singletons通常,我建议在
mapM
上使用
traverse
,因为
traverse
更一般。但是是的,这是正确的方法。一般来说,我建议在
mapM
上使用
traverse
,因为
traverse
更为通用。但是,这是正确的方法。