2014-08-29 75 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神拉姆達顧名思義就是明顯比這個解決方案更直接。