FUZxxl이 귀하의 질문에 언급 한 바와 같이, 나는 하스켈 I/O를 얼마나 들여다 보는지에 대해 질문합니다. 이것은 언어를 사용하기 위해 극복해야 할 큰 초기 장애물 중 하나이며 더 간단한 작업으로 시작하려는 것 같습니다.
하지만 여전히 귀하의 질문에 더 답하기 위해 두 가지 방법이 있습니다. 첫째, 초등학교 하나, 당신은 다른 사람 전에 먼저 이해하는 데 필요한 하나의 이해 :
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
과 동일한 작업을 수행 할 수 있지만 liftM2가 첫 번째 인수로 취하는 함수의 임의의 인수 인수에 해당합니다.
IO 처리 방법을 알고 있습니까? – fuz
'loadData'의 출력을'Map.intersection'에 어떻게 공급하려고합니까? 코드를 보여주세요. – dave4420
방금 Map.intersection을 시도해 보았습니다. <$> (loadData 1 "firstFile") <$> (loadData 1 "secondFile") – atlantis