Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 使用修改的元素修改并返回列表_Haskell - Fatal编程技术网

Haskell 使用修改的元素修改并返回列表

Haskell 使用修改的元素修改并返回列表,haskell,Haskell,我试图修改数据库列表中的一个元素以添加到评级中,我想返回一个包含新元素的修改后的数据库。我知道哈斯凯尔有不可改变的东西,但同时我也不太明白怎么做 以下是类型: data Film = Film Director Title Year Ratings deriving (Show,Ord,Eq, Read) testDatabase :: [Film] 我仅有的代码是: --addRating :: Rating -> Film -> Film --addRating r

我试图修改数据库列表中的一个元素以添加到评级中,我想返回一个包含新元素的修改后的数据库。我知道哈斯凯尔有不可改变的东西,但同时我也不太明白怎么做

以下是类型:

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 

find film运行得很好,但我无法让addRating正常工作,即使它正常工作,我仍然不知道如何将其全部组合在一起,以便有一个函数来调用以返回包含新分级元素的电影列表。

您的操作几乎是正确的:

addRating rating (Film name director year ratings)
    = (Film name director year [(ratings : rating)])
目前,您拥有以下代码:

[(ratings : rating)]
运算符的类型为a->[a]->[a],它接受一个元素并将其附加到列表的开头,而不是列表的结尾,因此需要切换参数

此外,语法[x]与您一样使用时,会创建一个由一个元素组成的列表。如果您在这里使用它,它将获取您创建的列表并将其包装到另一个列表中,这不是您想要的

您只需制作一个列表,其中包含在其余评分之前的评分:


你几乎说对了:

addRating rating (Film name director year ratings)
    = (Film name director year [(ratings : rating)])
目前,您拥有以下代码:

[(ratings : rating)]
运算符的类型为a->[a]->[a],它接受一个元素并将其附加到列表的开头,而不是列表的结尾,因此需要切换参数

此外,语法[x]与您一样使用时,会创建一个由一个元素组成的列表。如果您在这里使用它,它将获取您创建的列表并将其包装到另一个列表中,这不是您想要的

您只需制作一个列表,其中包含在其余评分之前的评分:


正如波格斯所说,你的评级和评级顺序都不对。您可能会发现记录语法方法更符合您的喜好:

data Film = Film {director :: Director, title :: Title, year :: Year, ratings :: Ratings}
                deriving (Show,Ord,Eq, Read)

addRating :: Rating -> Film -> Film
addRating rating film = film {ratings = rating : ratings film}

这里,film{director=Martin Scorsese}“更新”director字段,也就是说,这个表达式指的是有不同导演的电影,但其他所有内容都是相同的。不过,在本例中,您需要旧的ratings字段的内容,因此需要在ratings film之前添加rating。这种声明类型的方式使派生显示具有不同的外观。

正如Porges所说,您的评级和评级顺序错误。您可能会发现记录语法方法更符合您的喜好:

data Film = Film {director :: Director, title :: Title, year :: Year, ratings :: Ratings}
                deriving (Show,Ord,Eq, Read)

addRating :: Rating -> Film -> Film
addRating rating film = film {ratings = rating : ratings film}
这里,film{director=Martin Scorsese}“更新”director字段,也就是说,这个表达式指的是有不同导演的电影,但其他所有内容都是相同的。不过,在本例中,您需要旧的ratings字段的内容,因此需要在ratings film之前添加rating。这种声明类型的方式为派生显示提供了不同的外观

。。。我无法让addRating工作,即使它工作了,我仍然不工作 了解如何将其全部网格化,以便有一个可调用的函数 返回包含新分级元素的电影列表

似乎您希望有一个返回新数据的函数,该函数可以访问旧数据所在的位置

这里要理解的关键是,仅此一点就可以使其成为可变数据

函数式编程提供的一件事是保证数据总是相同的。在命令式非函数式语言中,如果有多个进程可能会更改数据,则必须小心它们不会以意外的方式修改彼此的数据。不可变的数据使这成为一个问题

如果你真的想要破坏性的更新,有很多方法可以做到。然而,您可能正在寻找的是,这是一种在不进行破坏性更新的情况下保持状态的好方法

。。。我无法让addRating工作,即使它工作了,我仍然不工作 了解如何将其全部网格化,以便有一个可调用的函数 返回包含新分级元素的电影列表

似乎您希望有一个返回新数据的函数,该函数可以访问旧数据所在的位置

这里要理解的关键是,仅此一点就可以使其成为可变数据

函数式编程提供的一件事是保证数据总是相同的。在命令式非函数式语言中,如果有多个进程可能会更改数据,则必须小心它们不会以意外的方式修改彼此的数据。不可变的数据使这成为一个问题


如果你真的想要破坏性的更新,有很多方法可以做到。然而,您可能正在寻找的是,这是一种在不进行破坏性更新的情况下保持状态的好方法。

理解不可变事物的关键在于,您不需要修改您所获得的内容,您只需创建一个稍微不同的副本,然后返回结果即可。例如,您有一个包含[1,2,3]的列表l。当您使用l++[4]时,您将返回 [1,2,3,4],但l的值没有改变

对你的电影记录使用同样的原则——你已经接近了

正如其他人所指出的,你的类型在评级中混淆了:评级表达式。要使用:,元素在前面,列表在后面。你可以改变你的类型,但这将把新的评级放在最前面,这可能是你不想要的。另一种方法是使用++,它附加了两个列表。因此,要使用++,您需要从单个元素中创建一个列表,并将其附加到现有的评级中

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

理解不可变事物的关键在于,你不需要修改你得到的东西,你只需要创建一个稍微不同的副本,然后返回结果。例如,您有一个包含[1,2,3]的列表l。当您使用l++[4]时,您会返回[1,2,3,4],但l的值没有改变

对你的电影记录使用同样的原则——你已经接近了

正如其他人所指出的,你的类型在评级中混淆了:评级表达式。要使用:,元素在前面,列表在后面。你可以改变你的类型,但这将把新的评级放在最前面,这可能是你不想要的。另一种方法是使用++,它附加了两个列表。因此,要使用++,您需要从单个元素中创建一个列表,并将其附加到现有的评级中

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