0 recursion haskell termination
我有一个需要在某种条件下终止的函数.例如,我们说我们有以下功能:
func :: Int -> [[Int]] -> [[Int]]
func _ [] = []
func x (a:as) = func2 x a:func x as
Run Code Online (Sandbox Code Playgroud)
func2 :: Int -> [Int] -> [Int]
func2 _ [] = []
func2 x (a:as) = x*a:func2 x as
Run Code Online (Sandbox Code Playgroud)
让我们说我希望func one被称为正常,但每当我们在[[Int]]输入中得到负值时,我们就会终止.所以我们只处理正值.所以你怎么能让func2发送一些信号来退出整个过程而不是继续?
首先,您的功能可以更简单地编写为
func1 x = map (func2 x)
func2 x = map (*x)
Run Code Online (Sandbox Code Playgroud)
现在,func2当遇到负值时,很容易更改为停止:
func2 x = map (*x) . takeWhile (> 0)
Run Code Online (Sandbox Code Playgroud)
编辑:
因此,如果我理解这一点,如果遇到负值,您希望整个计算失败.一种方法是将结果包装在一个Maybe.然后我们可以用monadic风格写这个:
func1 :: Int -> [[Int]] -> Maybe [[Int]]
func1 x = mapM (func2 x)
func2 :: Int -> [Int] -> Maybe [Int]
func2 x as = do
guard $ all (>= 0) as
return $ map (*x) as
Run Code Online (Sandbox Code Playgroud)