2009-04-27 18 views
1

私は、キー(String)と値(String)とキーと値の関連リストを与えられた関数を作成しなければなりません[(String, String)])。この関数は、キー/値のペアをリストの最後に追加することを目的としています。また、キーが関連付けられた値ですでにリストに存在する場合は、古い値を削除します。Haskell:関連リストの指定されたキーで要素を置き換える

私はキーと連想リストにlookupを使用してみましたが、私は出力をどうするかわからない - lookup関数の出力タイプがMaybe Stringある、と私は、リスト機能を行うように見えることはできません(要素を落とすなど)。私はリストを見渡すことができ、関連する値を知らずに、指定されたキーを持つリスト要素を削除する方法はありますか?

答えて

5

新しいキー/値ペアと既存のリストをパラメータとして使用し、新しい値が挿入された新しいリストを生成するためにリストをループする再帰関数を作成するとよいでしょう。各リスト要素に対して、挿入するキーと同じキーであるかどうかをチェックします。それが異なる場合は、古い要素を保持します。同じ場合は、古い要素の代わりに新しい項目を追加します。キーを見つけずにリストの終わりに達したら、最後に新しい項目を挿入するだけです。

4

ハスケルでは、結果として値を取得するかどうかわからないときは、しばしばMaybeデータ型を使用します。これは、Javaなどのより伝統的な言語のnull可能な型に相当します。次のように

Maybeが定義されています:

ある
data Maybe a = Nothing | Just a 

、値がaは、あなたが探していたオブジェクトがあるNothingまたはJust a、のいずれかとすることができます。たとえば、lookup関数を使用して"foo"という文字列を検索し、リスト内に("foo", "bar")タプルがある場合、結果はJust "bar"になります。しかし、"xyzzy"を検索した場合、Nothingとなります。

maybe関数を使用すると、Maybeの値をより有用なものにすることができます(わかりやすい名前、私は知っています - 関数はすべて小文字です)。

maybe default f (Just a) = f a 
maybe default f Nothing = default 

最初のパラメータはデフォルト値です。 Nothingがあればこれが返されます。それ以外の場合は、がaに適用されます。aは私たちが望むものです。あなただけのaバックをしたい場合は、fとしてid関数を渡すことができます。

maybe default id (Just a) = id a 

親切、id a = a

あなたの現在のlookupプランを引き続き使用したい場合は、これを使って何か役に立つものになります。私は個人的にはsthのメソッドを好む - それはプロセッサ上で簡単になるだろう。

2

ここでは、必要な機能を果たす簡単な機能を紹介します。それは新しいキー値のペアをとり、そのキーを除外した所与のassocリストの先頭にそれを置きます。

fst (first,second) = first 

filterは述語とリストを取り、述語を満たす要素のみを含むリストを返す:

addOrReplace :: Eq k => k -> v -> [(k, v)] -> [(k, v)] 
addOrReplace key value assoc = (key,value):(filter ((key /=).fst) assoc) 

関数fstは以下のように定義されます。

編集:addOrReplaceのパラメータでキー値のペアをトムの示唆するように分割します。

+0

キーと値をペアにするのではなく、別々の引数として渡すことをお勧めします。そうすることで、カレー化することなく機能を部分的に適用しやすくなります。 –

関連する問題