0

我有一个需要在特定条件下终止的功能。例如,假设我们有以下功能:

func :: Int -> [[Int]] -> [[Int]]

func _ [] = []

func x (a:as) = func2 x a:func x as

func2 :: Int -> [Int] -> [Int]

func2 _ [] = []

func2 x (a:as) = x*a:func2 x as

假设我希望 func one 被正常调用,但是每当我们在 [[Int]] 输入中得到一个负值时,我们就会终止。所以我们只处理正值。那么你怎么能让 func2 发送一些信号来退出整个过程而不是继续呢?

4

3 回答 3

5

首先,您的函数可以更简单地编写为

func1 x = map (func2 x)
func2 x = map (*x)

现在很容易在func2遇到负值时更改为停止:

func2 x = map (*x) . takeWhile (> 0)

编辑:

因此,如果我理解这一点,如果遇到负值,您希望整个计算失败。一种方法是将结果包装在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 
于 2011-05-02T06:47:51.720 回答
1

我不太确定你的意思,但我会试一试:

func _ [] = []
func x (a:as) | a < 0 = []
              | otherwise = func2 x a:func x as

这会以与空列表相同的方式终止负值的计算。我希望这是你想要的。

于 2011-05-02T06:45:36.020 回答
0

如果您不介意遍历 func2 中的列表两次,这可能有效:

导入数据。也许

func :: Int -> [[Int]] -> [[Int]]
func a xss = map fromJust 。takeWhile isJust 。地图(func2 a)$ xss

func2 :: Int -> [Int] -> Maybe [Int]
func2 a xs
  | 任何 (< 0) xs = 无
  | 否则 = 只是。地图 (*a) $ xs

于 2011-05-04T02:01:42.797 回答