我有一个函数,需要两个文件名,并将这两个文件的内容读入String
s,然后返回是否匹配。功能如下:
f :: String -> String -> IO Bool
f fileName1 fileName2 = do
str1 <- readFile fileName1
str2 <- readFile fileName2
return (str1 == str2)
如果我从内部这样使用它main
:
main = do
res <- f "A.txt" "B.txt"
print res
它可以工作并打印True
或False
。我想要做的是将此功能f
应用于文件名列表(元组)。对于类似的东西:
[("a.txt", "b.txt"), ("c.txt", "d.txt")]
(假设a.txt
和b.txt
具有相同的内容,c.txt
并且d.txt
与众不同)。
我想将其(文件名Bool
列表)转换为类似的列表[True, False]
。我尝试使用mapM
,但是似乎没有映射任何内容(当我在使用后打印列表时mapM
,它会打印相同的元组列表)。
所以我的问题是:我在做错什么,如何获得Bool
上面提到的s的列表?
请对我轻松一点,因为我对Haskell和函数式编程还很陌生:)
这是f'
您所描述的功能。
f' :: [(String,String)] -> IO [Bool]
f' = mapM $ uncurry f
让我知道是否有不清楚的地方!而且,为了清楚起见,这是如何运行它:
main = do
res <- f' [("a.txt", "b.txt"), ("c.txt", "d.txt")]
print res
该函数采用无点形式,因此等效于f' lst = mapM (uncurry f) lst
。mapM
实质上的每个元素映射lst
使用f
作为函数,并推动IO
到列表的外部。
uncurry
只需采用一种形式的功能a -> b -> c
并将其转换为一个(a,b) -> c
,这就是我们想要的,因为您有一个元组列表。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句