如何在Haskell中的递归函数中终止?

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发送一些信号来退出整个过程而不是继续?

ham*_*mar 5

首先,您的功能可以更简单地编写为

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)