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)

編集:

したがって、私がこの権利を理解していれば、負の値が発生した場合に計算全体が失敗することを望んでいます。これを行う 1 つの方法は、結果をMaybe. 次に、これをモナド スタイルで記述できます。

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 のリストを 2 回トラバースしてもかまわない場合は、次のようにするとうまくいく可能性があります。

import Data.Maybe

func :: Int -> [[Int]] -> [[Int]]
func a xss = map fromJust . takeWhile は Just です。マップ (func2 a) $ xss

func2 :: Int -> [Int] -> 多分 [Int]
func2 a xs
  | 任意 (< 0) xs = なし
  | それ以外の場合 = ただ。マップ (*a) $ xs

于 2011-05-04T02:01:42.797 に答える