Haskell 是否可以修改无限列表中的元素?

Haskell 是否可以修改无限列表中的元素?,haskell,Haskell,假设我有一个0的列表: zeroes = repeat 0 我想修改列表中的第n个成员。是否有一个内置的,或者我可以写一些函数来实现它?首先,这可能吗 注意:是的,我知道在haskell中,如果没有状态单子,就无法真正修改任何内容,因此将其视为构造一个与元素完全相同但因元素不同的新列表。单向: (take (n-1) zeroes) ++ [desired_nth_member] ++ (drop n zeroes) 单向: (take (n-1) zeroes) ++ [desired_n

假设我有一个0的列表:

zeroes = repeat 0
我想修改列表中的第n个成员。是否有一个内置的,或者我可以写一些函数来实现它?首先,这可能吗

注意:是的,我知道在haskell中,如果没有状态单子,就无法真正修改任何内容,因此将其视为构造一个与元素完全相同但因元素不同的新列表。

单向:

(take (n-1) zeroes) ++ [desired_nth_member] ++ (drop n zeroes)
单向:

(take (n-1) zeroes) ++ [desired_nth_member] ++ (drop n zeroes)
或使用:

例如:

> take 10 $ setNth 3 42 (repeat 0)
[0,0,0,42,0,0,0,0,0,0]
实际上,您并不真正需要函数:

> take 10 $ (repeat 0) & ix 3 .~ 42
[0,0,0,42,0,0,0,0,0,0]
请注意,这不仅仅适用于列表:

setNth :: Ixed t => Index t -> IxValue t -> t -> t

> setNth 1 42 (0,0,0)
(0,42,0)
或使用:

例如:

> take 10 $ setNth 3 42 (repeat 0)
[0,0,0,42,0,0,0,0,0,0]
实际上,您并不真正需要函数:

> take 10 $ (repeat 0) & ix 3 .~ 42
[0,0,0,42,0,0,0,0,0,0]
请注意,这不仅仅适用于列表:

setNth :: Ixed t => Index t -> IxValue t -> t -> t

> setNth 1 42 (0,0,0)
(0,42,0)

访问列表的第n个元素通常意味着您可能不希望出于性能原因使用列表。当然,这取决于您尝试执行的操作……访问列表的第n个元素通常意味着您可能出于性能原因不想使用列表。当然,这取决于你试图做什么……当然,如果零真的是无限的,那么删除n个零==零:@chepner:OP确实指定了列表是无限的,但没有指定所有元素都是相同的;零似乎只是一个例子。你也可以用splitAt替换take+drop并保存遍历。当然,如果零真的是无限的,那么drop n zeroes==zeroes:@chepner:OP确实指定列表是无限的,但没有指定所有元素都是相同的;零似乎只是一个例子。您还可以用splitAt替换take+drop并保存遍历。对于无点风扇,insert=bool id const val.==n、 对于无点风扇,插入=布尔id常量值==n、 欢迎来到StackOverflow,第一次回答得很好,真是太好了@谢谢,非常感谢。欢迎来到StackOverflow,第一个回答非常好,非常荣幸@谢谢,非常感谢。