在Haskell中,有没有办法在函数保护中执行IO?

时间:2010-01-26 10:43:53

标签: haskell io guard

例如:

newfile :: FilePath -> IO Bool
newfile x | length x <= 0 = return False
          | doesFileExist x == True = return False
          | otherwise = return True

这可以起作用吗?

4 个答案:

答案 0 :(得分:18)

您已经在IO monad,所以为什么不使用以下内容?

newfile :: FilePath -> IO Bool
newfile x | length x <= 0 = return False
          | otherwise = do exists <- doesFileExist x
                           return $ not exists

申请善意:

import Control.Applicative

newfile :: FilePath -> IO Bool
newfile x | length x <= 0 = return False
          | otherwise = not <$> doesFileExist x

正如您所看到的,申请路线比您在问题中使用的警卫更简洁!

答案 1 :(得分:6)

不,没有办法做到这一点(缺少不安全的技巧,这在这里完全不合适。)

BTW doesFileExist x == True会更好地写成doesFileExist x

答案 2 :(得分:5)

这有效并可以满足需要:

newfile :: FilePath -> IO Bool
newfile fn = do 
    x <- runErrorT $ do
        when ((length fn) <= 0) (throwError "Empty filename")
        dfe <- liftIO $ doesFileExist fn
        when (dfe) (throwError "File already exists")
        return True
    return $ either (\_ -> False) id x

答案 3 :(得分:3)

保护条款的类型必须为BooldoesFileExist x的类型为IO Bool。类型不匹配意味着你不能这样做。