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

时间:2016-09-21 04:17:58

标签: haskell

假设我有一个零列表:

source

我想修改该列表的第n个成员。是否内置了这个,或者我可以写一些功能来做到这一点?这首先是可能的吗?

注意:是的,我知道你不能在没有状态monad的情况下修改haskell中的任何内容,所以将其视为“构建一个完全相同但不同于一个元素的新列表”。

3 个答案:

答案 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]