2016-11-01 20 views
-1

私は問題があります。haskell listのN番目の要素を削除し、他のリストをそのインデックスに置き換えます。

リストからN番目の要素をすべて削除し、2番目のパラメータで指定されたリストの要素に置き換えます。

例; 3「hgfedcba」

出力「ABCDEFGH」

dropandreplace:「abhdeggh」

dropandreplace [1,0,3,0,5,0,7,0] 2 [2,4,6- 、8]

出力:私はそのコードを実装した[1,2,3,4,5,6,7,8]

dropn :: [Char] -> Int -> [Char] 
dropn list n = [ i | (i,c) <- (zip list [1,2..]), (mod c n) /= 0 ] 

しかし、このコードどのように私は他のリストの要素を置き換えることができます。..リストからドロップN番目の要素である??

+0

リストの引数の長さの比が与えられ、正しいされていない場合は 'N'、何が起こるのでしょうか? (例: 'dropandreplace [dropandreplace [1,0,3,0,5,0,7,0] 2 [2,4,6]') – mnoronha

+0

実際の質問に対して何を試しましたか?何が効いていないのですか?これらは[良い質問]のために必要な部分です(http://stackoverflow.com/help/how-to-ask)。 – crockeea

+0

"2番目のリストには十分な長さがありません"というエラーメッセージが表示されます。@mnoronha –

答えて

0

ここでは、再帰とsplitAtを使用する単純な解法があります。基本的には

dropandreplace :: [a] -> Int -> [a] -> [a] 
dropandreplace xs num (r:rs) 
    = case splitAt (num-1) xs of 
     (f, _:l) -> f ++ r : dropandreplace l num rs 
     (f, _) -> f -- `xs` if you want to preserve longer list 
dropandreplace _ _ _ = [] 

は、最初のn番目の文字を取るターゲットと交換し、再帰的。


それとも別の解決策:

dropandreplace :: [a] -> Int -> [a] -> [a] 
dropandreplace ss num rs = zipWith fromMaybe ss (expand rs) 
    where 
    expand [] = [] -- `repeat Nothing` if you want to preserve longer list 
    expand (x:xs) = replicate (num-1) Nothing ++ Just x : expand xs 
+0

2番目のリストに十分な長さがない場合は、 dropandreplace [1,0,3,0,5,0,7,0] 2 [2,4,6] 出力; [1,2,3,4,5,6] –

+0

(上記のコメントから)不均一な長さ方向に対処するには、空の2番目のリストにエラーを追加する必要があります: 'dropandreplace _ _ [] = error」置換リストには不十分なサイズ ""の場合があります。 – mnoronha

+0

@CanChalışkan、私は2つのコメントを追加しました。長いリストを保持したい場合は、それらを使用してください。 – utdemir

関連する問題