1

こんにちは、タプルのリストでタプルを置き換えられるようにしたいと思います。これが私が考えていることです:

let lst = [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)]

リストから ("rob",7) などの任意のタプルを削除し、それを新しいタプル ("ain",3) に置き換えられるようにしたいと考えています。最終的に、私の最終的なリストは次のようになります。

lst = [("john",3), ("greg",3), ("tom",2), ("ain",3), ("jason",4), ("tev",7)]

事前にご協力いただきありがとうございます。

4

4 に答える 4

9

それはできません。Haskell は純粋な関数型言語であるため、変数に値が設定されると、その値が永久に保持されます。

ただし、古いリストから新しいリストを簡単に計算できます

map (\ x -> if x == ("rob",7) then ("ain",3) else x) lst
于 2012-05-06T21:30:48.983 に答える
0

できることは次のとおりです。

import qualified Data.Map.Lazy as Map

lst = Map.fromList [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)]

lst2 = Map.insert "ain" 3 $ Map.delete "rob" lst

解釈された Haskell を使用している場合、手順は基本的に同じです。

Prelude> import qualified Data.Map.Lazy as Map
Prelude Data.Map.Lazy> let lst = Map.fromList [("john",3), ("greg",3), ("tom",2), ("rob",7),     ("jason",4), ("tev",7)]
Prelude Data.Map.Lazy> lst
fromList [("greg",3),("jason",4),("john",3),("rob",7),("tev",7),("tom",2)]
Prelude Data.Map.Lazy> let lst2 = Map.insert "ain" 3 $ Map.delete "rob" lst
Prelude Data.Map.Lazy> lst2
fromList [("ain",3),("greg",3),("jason",4),("john",3),("tev",7),("tom",2)]

「ain」は、「rob」があったマップ内の同じ「場所」にあるとは限らないことに注意してください。ただし、マップにはリストのような順序付けの概念がありません。

于 2012-05-06T23:37:54.887 に答える
0
replaceTuple :: [(String, Int)] -> (String, Int) -> (String, Int) -> [(String, Int)]
replaceTuple tups old new = map check tups where
    check tup | tup == old = new
              | otherwise  = tup


main = print $ replaceTuple [("john",3), ("greg",3), ("tom",2), ("rob",7), ("jason",4), ("tev",7)] ("tev", 7) ("newperson", 9001)

これは(型注釈からわかるように)(String、Int)のリストに対してのみ機能します。これはあなたが持っているものです。ただし、 の型シグネチャを使用して、より一般的な置換関数を定義できますreplace :: Eq b => [b] -> b -> b -> [b]。要素を比較しているためb、型クラスのインスタンスである必要があります。これが「Eq b => ...」の意味です。Eq

于 2012-05-06T21:35:37.743 に答える
0

リスト内で編集を行いたい場合、通常、リストをspanorbreakまたはsplitAtで分割し、変更を加えてから、 で貼り付けるのが最も簡単な方法だと思います++。したがって、この場合は次のようにします。

case break (\ (key,val) -> key == "rob") lst of
  (_, []) -> error "key not found! :("
  (xs, _ : ys) -> xs ++ ("ain", 3) : ys

Data.Sequenceを使用すると、必要updateなことを正確に、より高速に実行する関数があることに注意してください。

于 2012-05-07T10:35:47.727 に答える