1

データベースのリストの要素を変更して評価に追加しようとしています。新しい要素を含む変更されたデータベースを返したいです。Haskellには不変のものがあることは理解していますが、同時にそれを行う方法がよくわかりません。

種類は次のとおりです。

data Film = Film Director Title Year Ratings
     deriving (Show,Ord,Eq, Read)

testDatabase :: [Film]

私が持っている唯一のコードは次のとおりです。

--addRating :: Rating -> Film -> Film
--addRating rating (Film name director year ratings)= (Film name director year [(ratings : rating)])


--findFilm name = head $ filter (\(Film n _ _ _) -> n == name) testDatabase 

フィルムの検索はうまく機能しますが、addRating を機能させることができません。機能したとしても、すべてをメッシュ化して、要素を持つフィルムのリストを返す関数を呼び出す方法をまだ理解していません。それに関する新しい評価。

4

4 に答える 4

3

あなたはほとんどそれを正しかった:

addRating rating (Film name director year ratings)
    = (Film name director year [(ratings : rating)])

現時点では、次のコードがあります。

[(ratings : rating)]

:演算子にはタイプがあり、a -> [a] -> [a]1つの要素を取り、それをリストの最後ではなくリストの最初に追加するため、引数を切り替える必要があります。

また、構文[x]を使用すると、1つの要素で構成されるリストが作成されます。ここで使用すると、作成したリストが取得され、別のリストにラップされますが、これは必要なものではありません。

rating残りの部分の前に追加されたリストを作成する必要がありますratings

(rating : ratings)
于 2012-05-02T01:52:47.127 に答える
0

... I can't get the addRating to work, even if it did work I still don't understand how to mesh it all together to have a function to call to return a list of Film that has the element with the new ratings on it.

It seems like you'd like to have a function which returns the new data, in a way that can be accessed "where the old data used to be."

The key thing to understand here is that that alone would make it mutable data.

One thing that functional programming offers is the guarantee that data will always be the same. In an imperative (non-functional) language, if you have several processes which might change data, you have to be careful that they don't modify each others' data in unexpected ways. Immutable data makes this a non-issue.

If you truly would like destructive updates, there are ways to do that. However, probably what you're looking for is the State monad, which is a nice way to "carry around" state without destructive updates.

于 2012-05-02T03:13:21.813 に答える
0

「不変のもの」を理解するための重要な点は、与えられたものを変更する必要はなく、少し異なる「コピー」を作成し、それを結果として返すだけだということです。たとえば、lを含むリストがあるとします[1,2,3]。するとl ++ [4]元に戻りますが[1,2,3,4]の値はl変更されていません

映画の記録でも同じ原則を使用してください。あなたはすでに近づいています。

他の人が指摘したように、(ratings : rating)式に型が混同されています。を使用する:には、要素を前に置き、リストを後ろに置きます。タイプを切り替えることもできますが、それによって新しい評価が前面に出てしまい、望ましくない場合があります。別の方法は、 2 つのリスト++を追加する を使用することです。を使用するには、単一の要素からリストを作成し、それを既存の評価に追加する必要があります。++

addRating :: Rating -> Film -> Film
addRating rating (Film name director year ratings) =
    (Film name director year (ratings ++ [rating]))
于 2012-05-03T04:19:27.827 に答える