1

私は Haskell を初めて使用し、リストに対して再帰関数を実行しようとしています。再帰が完了したら、再帰から出力リストにアクセスして追加の操作を実行したいと考えています。

たとえば、以下の関数は、保持する値とリストを受け取り、保持する値のみを含むリストを返し、他の値はすべて破棄します。

私がやりたいことは、再帰が行われた後に出力リストにアクセスする方法を理解して、それを操作し続けることができるようにすることです。

何かのようなもの:

//recursive function here

//get length of output list from recursive function
length list

私の機能

keepAll _ [] = []
keepAll y (x:xs) | x==y = y:keepAll y xs
                 | otherwise = keepAll y xs

よろしくお願いします!

4

3 に答える 3

5

まず、あなたkeepAllは次のように書かれた簡単です

keepAll y = filter (y==)

length次に、次のように、結果に適用することができます。

length (keepAll 'a' "abrakadabra")

5である必要があります。


したがって、「gの結果にfを適用するにはどうすればよいですか」という質問に対する一般的な答えは次のとおりです。

(f . g)
于 2013-02-23T18:21:31.387 に答える
3

関数合成を探しています。

次のように、ある関数の出力を別の関数の入力として渡すことができます。

f (g x)

または

(f . g) x

関数 g の出力型は、f への入力と同じ型です。

(.) 演算子は、このような 2 つの関数をパイプラインに結合します。

于 2013-02-23T18:26:03.833 に答える
1

一般的なケースの関数構成とは別に、keepAll の特定の結果を変数に割り当て、後でその値を操作することもできます。

outputList = keepAll 3 [1,2,3,3,3,4,5,3]
print (init outputList)   >> [3,3,3]
print (length outputList) >> 4


関数内の再帰の出力リストにアクセスしたい場合は、再帰を内部の「ヘルパー」関数に委譲することができます。次に例を示します。

keepSome y (x:xs) = keepAll y (x:xs)
  where keepAll _ [] = []
        keepAll y (x:xs) | x==y = y:keepAll y xs
                         | otherwise = keepAll y xs

あなたが提案したように、再帰の結果に「init」を適用するように、最初の行を変更できます。

keepSome y (x:xs) = init $ keepAll y (x:xs)
  where keepAll _ [] = []
        keepAll y (x:xs) | x==y = y:keepAll y xs
                         | otherwise = keepAll y xs

たとえば、再帰の出力リストに「outputList」という名前を付けて作業しやすくし、init を適用することもできます。

keepSome y (x:xs) = init outputList
  where outputList = keepAll y (x:xs)
        keepAll _ [] = []
        keepAll y (x:xs) | x==y = y:keepAll y xs
                         | otherwise = keepAll y xs

サンプル出力:
*Main> keepSome 3 [1,2,3,3,3,4,5,3]
[3,3,3] -- 内部結果の初期化 [3,3,3,3]

于 2013-02-23T19:55:10.580 に答える