假设我有一个零列表:
source
我想修改该列表的第n个成员。是否内置了这个,或者我可以写一些功能来做到这一点?这首先是可能的吗?
注意:是的,我知道你不能在没有状态monad的情况下修改haskell中的任何内容,所以将其视为“构建一个完全相同但不同于一个元素的新列表”。
答案 0 :(得分:4)
一种方式:
ERROR: Loading command: update (LoadError)
cannot load such file -- zlib
ERROR: While executing gem ... (NoMethodError)
undefined method `invoke_with_build_args' for nil:NilClass
答案 1 :(得分:3)
或使用Lens:
import Control.Lens
setNth :: Int -> a -> [a] -> [a]
setNth = set . ix
例如:
> 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]
请注意,这可以与a lot more types一起使用,而不仅仅是列表:
setNth :: Ixed t => Index t -> IxValue t -> t -> t
> setNth 1 42 (0,0,0)
(0,42,0)
答案 2 :(得分:2)
setNth :: Int -> a -> [a] -> [a]
setNth n val = zipWith insert [0..]
where insert i x | i == n = val
| otherwise = x
> take 10 . setNth 5 2 $ repeat 0
[0,0,0,0,0,2,0,0,0,0]