gpt4 book ai didi

list - 通过添加元素修改当前列表 - Haskell 101

转载 作者:行者123 更新时间:2023-12-04 23:38:19 26 4
gpt4 key购买 nike

我想在数据类型 Director 的“电影”列表中添加一个元素变量名为 billy .

type Name  = String
type Movie = String
data Director = Director {name:: Name, movies::[Movie]}
deriving (Show)
let billy = Director "Billy J." ["Good movie 1"]

--addMovieToDirector :: Movie -> Director -> Director
addMovieToDirector m (Director n ms) = Director n (m:ms)

问题是以前的函数没有更新比利的电影列表,它创建了一个新的 Director使用所需的列表(更改不存储在 billy 上)。如何在不创建另一个列表的情况下对比利的列表进行操作 Director ?我明白,Haskell 使用常量,但是每次修改列表时我是否应该创建一个不同的“billy”“变量”?

谢谢!

最佳答案

您想做的事情可以描述为“就地修改”或“使用可变数据”。

Haskell 有很多方法可以做到这一点。由于就地修改任何东西几乎总是被认为是“副作用”,所以这些事情只能在 IO monad 中完成,或者使用像 unsafePerformIO 这样的肮脏技巧。 .

这些都是一些高级主题,在初学者级别,将 Haskell 值视为完全不可变的可以说是有益的。

所以是的,你不能修改变量。实际上根本没有“变量”。

想想billy作为值的名称,而不是变量。

在 Haskell 中,函数所能做的就是接受参数,并计算一些结果而没有任何副作用。

对于来自命令式语言的人来说,这可能是最大的心理障碍:“如果我不能修改数据,我应该如何处理它”?

答案是:你应该像巨型流水线一样构建你的程序:原 Material (原始数据,初始参数等)在开始时(你调用的第一个函数)放在线上,每个工作站(函数)做一些事情有用(返回一个值),消耗前一个工作站的结果。最后,一些有值(value)的东西可能会掉线。

我描述的是简单的函数组合:如果你需要做c之后的任务 b , 后 a , 值 x ,那么你可以写成 (c . b . a) x , 或 c (b (a x))或者更确切地说 c $ b $ a x .

通过这种方式,您可以编写程序而无需显式更改任何内容,而只需描述如何从旧内容中创建新内容。

这听起来非常低效,事实上,函数式编程对性能有一些影响(更不用说懒惰了)。然而,编译器足够聪明,可以找出关于用 Haskell 编写的程序的很多事情,并以某些方式对其进行优化。

我希望这一切很快就会有意义。 :)

哦,欢迎来到 Haskell。 ;)

关于list - 通过添加元素修改当前列表 - Haskell 101,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47202568/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com