比较haskell中的两个文件/将两个IO字符串传递给一个函数

时间:2014-04-06 07:13:53

标签: haskell monads

我是Haskell和monads的新手,我正在尝试编写一个简单的程序,将两个文件加载到Strings中,然后使用比较函数将String作为Char-lists进行比较(稍后应将其替换为花式)。但我无法弄清楚如何将这些IO列表传递给比较函数和最终打印输出......在代码中

import System.IO  
import Control.Monad


cmp :: (Eq a) => [a] -> [a] -> Bool
cmp []      []      = True
cmp []      (y:ys)  = False
cmp (x:xs)  []      = False
cmp (x:xs)  (y:ys)  = (x==y) && cmp xs ys

main = do
    l1 <- readFile "dat1"
    l2 <- readFile "dat2"
    print . cmp =<< l1 =<<l2

最后一行

print . cmp =<< l1 =<<l2

不起作用,必须更换......但是怎么做?

非常感谢您提前提出任何建议

2 个答案:

答案 0 :(得分:5)

l1l2已经String,因此您可以直接使用print $ cmp l1 l2

答案 1 :(得分:3)

还有另一种方法可以做到这一点:liftM2 cmp的类型为IO [a] -> IO [a] -> IO Bool,因此liftM2 cmp (readFile "dat1") (readFile "dat2")IO Bool,您可以写

main = print =<< liftM2 cmp (readFile "dat1") (readFile "dat2")