あなたの質問にFUZxxlがコメントしたように、私はあなたがHaskell I/Oをどの程度調べているか質問します。これは、言語を利用するために乗り越える大きな初期のハードルの1つであり、より簡単なタスクから始めたいと思うようです。
さらに、あなたの質問にもっと答えるために、ここでは2つの方法があります。まず、基本1、あなたは他のものが意味を作る前に、まず理解する必要がある1:
processData :: Int -> FilePath -> Int -> FilePath -> IO (Map.Map [Char] Double)
processData int1 path1 int2 path2 =
do map1 <- loadData int1 path1
map2 <- loadData int2 path2
return (Map.intersection map1 map2)
関数に上記のようなパターンを抽象伴い、より高度な答えがあります。これを行うより基本的な方法は、Control.Monad
モジュールのliftM2
関数を使用することです。私はちょうどそれは、上記のコードに関連していますどのようにそれを明らかにするためにliftM2
の実装例をあげる:
processData :: Int -> FilePath -> Int -> FilePath -> IO (Map.Map [Char] Double)
processData int1 path1 int2 path2 =
liftM2 Map.intersection (loadData int1 path1) (loadData int2 path2)
dave4420の答えは次のとおりです。liftM2
で
liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f mx my = do x <- mx
y <- my
return (f x y)
、我々はprocessData
をこのように書き換えることができますもう少し進んだ。つまり、Control.Applicative
には、liftM2
と同じことを行うことができる2つの演算子(<$>
と<*>
)がありますが、liftM2が最初の引数として取る関数の任意の数の引数があります。
IOの処理方法はまだ分かりますか? – fuz
'loadData'の出力を' Map.intersection'にどのように供給しようとしていますか?あなたのコードを私たちに教えてください。 – dave4420
私はMap.intersectionをやってみました。<$>(loadData1 "firstFile")<$>(loadData1 "secondFile") – atlantis