例如:
newfile :: FilePath -> IO Bool
newfile x | length x <= 0 = return False
| doesFileExist x == True = return False
| otherwise = return True
这可以起作用吗?
答案 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)
保护条款的类型必须为Bool
。 doesFileExist x
的类型为IO Bool
。类型不匹配意味着你不能这样做。