2016-04-21 63 views
0

我有一个返回IO X(假设X是特定类型)的函数。其中一个参数是输出目录的路径。如果这不存在,它必须被创建。使用IO()操作,但返回IO X

我想使用createDirectoryIfMissing返回IO(),但我不知道如何保持类型一致。我所做的(和失败)是这样的:

process :: (Mutation a, Show a, Arbitrary a) 
=> ((a -> BSL.ByteString),(BS.ByteString -> a)) 
-> Bool -> FilePath -> String -> String -> 
Int -> Int -> FilePath -> FilePath -> IO Result 
process (mencode,mdecode) par filename cmd prop maxSuccess maxSize outdir seeds = 
let (prog, args) = (Prelude.head spl, Prelude.tail spl) 
in (case prop of 
    "exec" -> 
     quickCheckWithResult stdArgs { maxSuccess = maxSuccess , maxSize = maxSize, chatty = not par } 
     (noShrinking $ execprop filename prog args mencode outdir) 
    "honggfuzz" -> 
     --do 
     --createDirectoryIfMissing True outdir (This fails) 
     quickCheckWithResult stdArgs { maxSuccess = maxSuccess , maxSize = maxSize, chatty = not par } 
     (noShrinking $ honggprop filename prog args mencode outdir) 

    _  -> process_custom arbitrary (mencode,mdecode) par filename cmd prop maxSuccess maxSize outdir seeds 

) where spl = splitOn " " cmd 

quickCheckWithResult ::可测试道具=>参数数量 - >属性 - > IO结果 process_custom是基本相同的过程,但与其他参数

编辑:现在实际的代码,对不起

+2

您没有看到足够的代码来查看您做错了什么。 – dfeuer

+0

请至少为您使用的编译成功的东西提供类型签名,以及您坚持使用的完整代码。 – dfeuer

+0

你的问题不太清楚。你想创建一个目录并在那之后返回一些特定的内容? – wowofbob

回答

2

例子:

foo :: Int -> IO Int 
foo n = do 
    putStrLn "Hello" -- :: IO() 
    return (n+1)  -- :: IO Int 

do块中的最后一条语句必须与功能签名匹配。

或者,使用>>>>=

foo n = putStrLn "Hello" >> return (n+1) 
bar n = getChar >>= \c -> return (fromEnum c) 

都有类型Int -> IO Int