Haskell - 模式匹配和exitSuccess

4

我有一个如下所示的函数:

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 typeIO 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 a返回类型,所以在该模式上类型不匹配。但是,正确/优雅的方法是什么?

2个回答

7

exitSuccess行使用lambda:

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

请注意,在这种情况下,do也是多余的,因为do foo等同于foodo符号仅在您有一系列要执行的操作时才有用。

2
除了模式匹配,您还可以使用多个 const 调用来实现这一点:
outputDelayCo (Just 1) = const . const . const $ exitSuccess

如果你喜欢这种方式,这会保持事情的无点风格,但我认为像Ganesh建议的lambda函数比这个解决方案更加显而易见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接