3

私が書こうとしている関数は、指定されたインデックスの要素を任意のタイプの指定されたリストから削除する必要があります。

これが私がすでに行ったことです:

           delAtIdx :: [x] -> Int -> [x]

           delAtIdx x y = let g = take y x
                          in let h = reverse x
                          in let b = take (((length x) - y) - 1) h
                          in let j = g ++ (reverse b)
                          in j

これは正しいです?誰かが別のアプローチを提案できますか?

4

6 に答える 6

9

の観点から定義する方がはるかに簡単ですsplitAt。これは、特定のインデックスの前でリストを分割します。次に、最初の要素を 2 番目の部分から取り外して、それらを再び接着するだけです。

于 2012-04-21T04:56:43.070 に答える
3

reverseおよび連結は、haskell で可能であれば避けるべきものです。それは私にはうまくいくように見えますが、それについては完全にはわかりません。

ただし、「本当の」質問に答えるには: はい、別の (より簡単な) 方法があります。基本的に、haskell で作業するときと同じ方向 (再帰) に目を向ける必要があります。この関数の再帰バージョンを作成できるかどうかを確認してください。

于 2012-04-21T04:54:23.343 に答える
0
deleteAt :: Int -> [a] -> [a]
deleteAt 0 (x:xs) = xs
deleteAt n (x:xs) | n >= 0 = x : (deleteAt (n-1) xs)
deleteAt _ _ = error "index out of range"
于 2015-12-05T07:19:47.217 に答える
0

これが私の解決策です:

removeAt xs n     | null xs   = []
removeAt (x:xs) n | n == 0    = removeAt xs (n-1)
                  | otherwise = x : removeAt xs (n-1)
于 2016-10-21T10:05:01.103 に答える