2014-08-29 93 views
4

我有一个类似如下的功能:哈斯克尔 - 模式匹配和exitSuccess

outputDelayCo :: Maybe Int -> (Event -> ByteString) -> [Event] -> Int -> IO() 
outputDelayCo Nothing = outputDelay Nothing 
outputDelayCo (Just 1) = do exitSuccess 
outputDelayCo (Just n) = outputDelay (Just (n-1)) 

我得到这个错误:

Couldn't match expected type ‘(Event -> ByteString) 
           -> [Event] -> Int -> IO()’ 
      with actual type ‘IO a0’ 
In a stmt of a 'do' block: exitSuccess 
In the expression: do { exitSuccess } 

我可以这样做修复它,但它更丑陋:

outputDelayCo :: Maybe Int -> (Event -> ByteString) -> [Event] -> Int -> IO() 
outputDelayCo Nothing a b c = outputDelay Nothing a b c 
outputDelayCo (Just 1) _ _ _ = do exitSuccess 
outputDelayCo (Just n) a b c = outputDelay (Just (n-1)) a b c 

我明白为什么有一个错误:做exitSuccess是要去有一个IO返回类型,所以类型不上拍匹配燕鸥。但是,什么是正确的/优雅的方式来做到这一点?

回答

6

使用的exitSuccess行拉姆达:

outputDelayCo (Just 1) = \_ _ _ -> exitSuccess 

注意,do也是在这种情况下作为do foo冗余相当于foo。当您有一系列要做的事情时,do表示法才有用。

2

除了模式匹配,您可以使用多个呼叫const

outputDelayCo (Just 1) = const . const . const $ exitSuccess 

这让事情pointfree,如果你进入的是诸如此类的事情,但我认为,像Ganesh神拉姆达顾名思义就是明显比这个解决方案更直接。